給定兩棵樹,你如何找到其中一棵樹是其他的子樹? 給這個最好的算法...並且還給出你所回答的順序...給定兩棵樹,你如何找到其中一棵樹是其他的子樹?
0
A
回答
5
首先想到的是遍歷一棵樹,看看它的任何一個孩子是否是頭另一棵樹。然後反轉。
如果你知道每棵樹的高度,你或許可以找出哪棵樹可能是另一棵樹的子樹。
如果您知道樹木的其他細節或特性(排序與否,是否平衡),您可以使用這些特性提出更快的算法。
0
以下是我們可以做的事情:假設我們有一個叫isSubSet
的函數獲取兩棵樹的根。另一方面,我們有一個叫isIdentical
的函數,它檢查兩棵樹是否相同。
我們假設我們想要看看樹S是否是樹T的一個子集。如果T和S是相同的,那麼它們是,否則我們通過再次調用isSubset
函數來通過S。但是這次我們發送T-> Left和S作爲T的左子樹並且T->右和S作爲右子樹S.
可以在here中找到代碼和更多信息。
0
假設你有雙向樹,你應該簡單地調用這個方法兩次,複雜度將是O(k),其中k = n + m,其中n和m - 兩棵樹的高度。
isSubtree(Node n1, Node n2){
while(n2.parent != null){
if(n2.parent == n1){
return true;
}
n2=n2.parent;
}
return false;
}
你可以做得更好,如果你還記得訪問父節點:
isParent(Node n1, Node n2){
Set<Node> parents = new HashSet<Node>();
parents.add(n1);
parents.add(n2);
while(n1.parent != null || n1.parent != null){
if (parents.contains(n1.parent)){
n1 is subtree of n2
}
if (parents.contains(n2.parent)){
n2 is subtree of n1
}
parents.add(n1.parent);
parents.add(n2.parent);
n1=n1.parent;
n2=n2.parent;
}
not a subtrees
}
相關問題
- 1. 如果一棵二叉樹是另一棵樹的子樹
- 2. 如何將一棵樹分割成兩棵子樹
- 3. 找到另一棵樹上的一棵樹的節點
- 4. 證明一棵二叉樹是另一棵的子樹
- 5. 二叉搜索樹 - 複製一棵樹到另一棵樹
- 6. primefaces從一棵樹和降拖動到其他樹
- 7. 限制jstree從一棵樹拖動到其他樹
- 8. 我想找到一棵樹是否是另一棵樹的子樹,並運行到ArrayList比較prolem
- 9. 檢查一棵樹是否是一棵完美的樹
- 10. 一棵樹的價值與其他樹匹配
- 11. 比較兩棵樹
- 12. 合併兩棵定向樹?
- 13. OCaml的 - 一棵樹
- 14. SimpleXML:將一棵樹追加到另一棵樹
- 15. 你如何遍歷一棵樹?
- 16. 實現一棵葉子樹
- 17. 找到一棵樹,給定它的葉子上的數據
- 18. 的jQuery得到一棵樹
- 19. 查找兩棵樹是否同構
- 20. 如何找到最接近另一棵樹的樹?
- 21. 並行繼承樹,其中來自一棵樹的類具有來自另一棵樹的類的容器
- 22. OrderedDict是一棵樹嗎?
- 23. 可拖動的兩棵樹
- 24. 得到一棵樹結構的孩子
- 25. 合併兩棵二叉樹
- 26. 當兩棵樹相等時?
- 27. 合併兩棵樹集合
- 28. 這棵樹是二叉搜索樹嗎?
- 29. 如何在所有可能的子樹上分割一棵樹?
- 30. 一棵樹的和絃
你可以做一個序遍歷,然後檢查是否較小的順序是在較長序列的連續子序列。 – nikhil
樹是雙向的嗎?什麼是參數:樹根/只是一個2個節點? –