当前位置: 首页 > news >正文

算法面试题-- 连接树的所有兄弟节点

前几天遇到了一个面试题,考察的也是树,和普通的树遍历不同,稍微改动了一下,就是对已经建立好的树,每个连接兄弟节点。
节点定义如下:
public IList<Node> Children;
public Node Right;
public string Val; 
包含了子节点集合,右节点。
问题:现在树已经建立好,可是Right为空,把所有的兄弟节点(不是同一个Parent的也要连)连接起来。


树:


连接后变成:



思路:

1. 遍历每个子节点,连接当前子节点的下1个子节点(除最后一个)
2. 遍历每个子节点时,将当前子节点的最后一个子节点与下1个子节点的第一个子节点连接(如果存在)
3. 递归执行

实现如下:



void Main()
{
	// setup 
	var root = new Node("R");
	var childGroup1 = new List<Node>();
	root.Children.Add(new Node("A1", new List<Node>(){new Node("B1"),new Node("B2")}));
	root.Children.Add(new Node("A2", new List<Node>(){new Node("B3"),new Node("B4")}));
	
	// search and link the brother nodes
	TravelAndLink(root);
	
	Console.WriteLine(root);
}


static void TravelAndLink(Node current){
	if(current == null || current.Children == null){
		return;
	}
	
	var len = current.Children.Count;
	for(var i = 0;i < len; i++){
		// link right if have 
		if(i < len - 1){
			current.Children[i].Right = current.Children[i+1];
			
			// link current son's last son to his next brother's first son if possible
			if(current.Children[i].Children.Any() && current.Children[i+1].Children.Any()){
				var c1 = current.Children[i].Children.Last();
				var c2 = current.Children[i+1].Children.First();
				c1.Right = c2;
			}
		}
		
		//recursive
		TravelAndLink(current.Children[i]);
	}
	
	// link my last child to brother's first child if impossible
}


public class Node
	{
		public Node(string v, IEnumerable<Node> children = null)
		{
			Val = v;
			
			Children = new List<Node>();
			if(children != null){
				Children = children.ToArray();
			}
			
			Right = null;
		}
	
	    public IList<Node> Children;
	    public Node Right;
		public string Val; 
	}


相关文章:

  • 怀念穆大叔
  • LeetCode -- Flatten 二叉树
  • [IE编程] WebBrowser控件的多页面浏览(Tabbed Browsing)开发接口
  • LeetCode -- 查找最小公共祖先
  • 8位程序员对Oracle收购Sun的担忧与期待
  • LeetCode -- 顺时针旋转图片90度
  • LeetCode -- Path Sum ||
  • 35岁IT“老人”的随笔
  • LeetCode -- Decode Ways
  • 嵌入式Linux系统中的GUI系统的研究与移植
  • LeetCode -- Substring with Concatenation of All Words
  • asp.net MVC5 sitemap 的使用
  • CentOS 5.x 預設啟動的服務簡易說明
  • Leet -- Remove Duplicates from Sorted Array
  • LeetCode -- Best Time to Buy and Sell Stock II
  • #Java异常处理
  • “大数据应用场景”之隔壁老王(连载四)
  • 78. Subsets
  • canvas绘制圆角头像
  • es6
  • Fundebug计费标准解释:事件数是如何定义的?
  • gitlab-ci配置详解(一)
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Java 最常见的 200+ 面试题:面试必备
  • linux安装openssl、swoole等扩展的具体步骤
  • Otto开发初探——微服务依赖管理新利器
  • PHP变量
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • SpiderData 2019年2月25日 DApp数据排行榜
  • vue-loader 源码解析系列之 selector
  • 二维平面内的碰撞检测【一】
  • 服务器从安装到部署全过程(二)
  • 基于Volley网络库实现加载多种网络图片(包括GIF动态图片、圆形图片、普通图片)...
  • 记一次和乔布斯合作最难忘的经历
  • 普通函数和构造函数的区别
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 小程序01:wepy框架整合iview webapp UI
  • 移动端唤起键盘时取消position:fixed定位
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 回归生活:清理微信公众号
  • #我与Java虚拟机的故事#连载13:有这本书就够了
  • (4)(4.6) Triducer
  • (博弈 sg入门)kiki's game -- hdu -- 2147
  • (超详细)2-YOLOV5改进-添加SimAM注意力机制
  • (附源码)springboot青少年公共卫生教育平台 毕业设计 643214
  • (简单) HDU 2612 Find a way,BFS。
  • (实战篇)如何缓存数据
  • (四)Linux Shell编程——输入输出重定向
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • .bat批处理(二):%0 %1——给批处理脚本传递参数
  • .h头文件 .lib动态链接库文件 .dll 动态链接库
  • .mat 文件的加载与创建 矩阵变图像? ∈ Matlab 使用笔记