我看到很多面试问题,其中的问题需要遍历两棵树在一起,我不确定如何去做这件事。穿越两棵树在一起?
例如到的两个二进制树树根
鉴于引用,你如何确定是否 叶元素的顺序相同,但是当第一个节点违反 规则必须 实现短路回报。
我看到很多面试问题,其中的问题需要遍历两棵树在一起,我不确定如何去做这件事。穿越两棵树在一起?
例如到的两个二进制树树根
鉴于引用,你如何确定是否 叶元素的顺序相同,但是当第一个节点违反 规则必须 实现短路回报。
是您的问题,问以找出是否: “访问的两棵树的所有叶子节点产生的顺序是一样的”
与约束,当发现叶值不匹配,那么我们必须立即退出。
如果是的话,我建议以下解决方案:
insert (root of tree1) in stack1
insert (root of tree2) in stack2
temp1 = (root of tree1) -> left child
temp2 = (root of tree2) -> left child
while(stack1 and stack2 arent empty)
{
found = false
while(found == false) {
if (temp1 is leaf node)
child1 = value of temp1
found = true
pop element from stack1
set temp1 to its right child
if (temp1 has left child)
put temp1 in stack1
set temp1 to its left child
}
found = false
while(found == false) {
if (temp2 is leaf node)
child2 = value of temp2
found = true
pop element from stack2
set temp2 to its right child
if (temp2 has left child)
put temp2 in stack2
set temp2 to its left child
}
if(child1 != child2)
return
}
在伪代码:
您提出的解决方案听起来不错,第4步似乎可以通过IN命令遍历来实现。 – 2013-01-29 16:18:54
一种可能的解决方案:
我已经创建了一个树类,其具有方法GetNextLeafNode()。这是负责返回树的下一个立即叶节点。
随着树类我保持的堆叠维持横穿元件
在GetNextLeafNode()方法,我做迭代树遍历(预顺序)。
每当我遇到一个节点(stack.Pop()),这是叶,我只是回到它。否则,我会将左指针和右指针推向堆栈。最初推送根节点。在任何时候堆栈状态都是正确的。
下面是C#代码:
public TreeNode GetNextLeafNode()
{
TreeNode leaf = null;
while (s.Count != 0)
{
TreeNode n = s.Pop();
if ((n.Left == null) && (n.Right == null))
{
leaf = n;
return leaf;
}
else
{
if (n.Right != null)
s.Push(n.Right);
if (n.Left != null)
s.Push(n.Left);
}
}
return leaf;
}
现在,我们可以创建两个不同的树说,T1和T2。 我们可以做的比较如下:
int data1 = t1.GetNextLeafNode().Data;
int data2 = t2.GetNextLeafNode().Data;
while (data1 == data2)
{
//both the leaf nodes are same.
data1 = t1.GetNextLeafNode().Data;
data2 = t2.GetNextLeafNode().Data;
}
如果temp1中不是叶节点,具有唯一正确的(叶)的孩子,你会如何到达那里? – 2015-03-08 10:50:15