码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-08-04 17:19:32      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

前几天遇到了一个面试题,考察的也是树,和普通的树遍历不同,稍微改动了一下,就是对已经建立好的树,每个连接兄弟节点。
节点定义如下:
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; 
	}


版权声明:本文为博主原创文章,未经博主允许不得转载。

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

标签:

原文地址:http://blog.csdn.net/lan_liang/article/details/47278445

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!