我看到很多面試問題,其中的問題需要遍歷兩棵樹在一起,我不確定如何去做這件事。穿越兩棵樹在一起?
例如到的兩個二進制樹樹根
鑑於引用,你如何確定是否 葉元素的順序相同,但是當第一個節點違反 規則必須 實現短路回報。
我看到很多面試問題,其中的問題需要遍歷兩棵樹在一起,我不確定如何去做這件事。穿越兩棵樹在一起?
例如到的兩個二進制樹樹根
鑑於引用,你如何確定是否 葉元素的順序相同,但是當第一個節點違反 規則必須 實現短路回報。
是您的問題,問以找出是否: 「訪問的兩棵樹的所有葉子節點產生的順序是一樣的」
與約束,當發現葉值不匹配,那麼我們必須立即退出。
如果是的話,我建議以下解決方案:
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