假設你有兩棵二叉樹,你想知道它是否是另一棵的一棵子樹。一種解決方案是獲取兩棵樹的順序和前序遍歷,並檢查候選子樹的遍歷是否是另一棵樹的相應遍歷的子串。我閱讀了幾篇關於這個解決方案的文章。其中一個discussion顯示順序和前序遍歷都是必需的。有人可以解釋他們爲什麼足夠嗎?爲什麼如果tree2的inorder和preorder遍歷是那些tree1的子串,那麼tree2是tree1的一個子樹?證明一棵二叉樹是另一棵的子樹
1
A
回答
1
問:一個討論表明,中序和序遍歷都是 必要的。有人可以解釋他們爲什麼足夠嗎?
由於簡單的事實,所以能夠唯一地重建從這兩個遍歷的二進制樹的(或序和後序,以及)。檢查這個例子:
Inorder : [1,2,3,4,5,6]
Preorder : [4,2,1,3,5,6]
從前序,你知道4是樹的根。從序,你能確定左,右子樹,你從這個角度出發遞歸:
4
/ \
Left subtree Right subtree
Inorder : [1,2,3] Inorder : [5,6]
Preorder: [2,1,3] Preorder: [5,6]
檢查這個優秀的文章中更多的細節: Reconstructing binary trees from tree traversal。由於這兩個結合在一起的樹的串行化(實際上將樹序列化爲一個字符串)必須是二叉樹唯一的,所以當且僅當這些遍歷是其他兩個串行化的子串時,我們才能得到這棵樹是另一棵樹的子樹。
1
人們同意二叉樹可以通過左/右關係表示節點上的順序。這意味着左邊部分在右邊部分之前。如果訂單相同,您可以調用相同的樹木。所以順序串表示順序,如果你想檢查等價性,那麼僅檢查順序(按定義)就足夠了。 但是,當你想檢查樹的完全平等時,我們必須找到如何區分等價樹的方式。例如,它可以是水平順序檢查。但是對於子樹級別的順序不適合,因爲子樹的級別順序字符串被拆分。對於預購,您可以在樹的其他部分之前行走子樹樹根。
假設等價樹不相等,那麼在預先遍歷中,所有東西都是相等的,直到第一個不同。 2種情況可能發生。
1)一棵樹的節點值不同。這意味着預購字符串不同,因爲您按預訂順序走樹。
2)孩子簽名(沒有孩子,只有左邊,只有右邊,兩個孩子)不同。但在這種情況下,易於理解的是有序變化和樹木不等價,這與條件相矛盾。
請注意,這僅適用於所有節點都是唯一的。如果你的所有節點的價值都是「a」,那麼無論你如何走路,你的字符串總是「aa ... a」。所以你必須以某種方式區分節點,而不僅僅是「價值」。
相關問題
- 1. 如果一棵二叉樹是另一棵樹的子樹
- 2. 二叉搜索樹 - 複製一棵樹到另一棵樹
- 3. Shifiting一棵二叉樹
- 4. 二叉樹是否包含另一棵樹?
- 5. 這棵樹是二叉搜索樹嗎?
- 6. 合併兩棵二叉樹
- 7. Node類代表一棵二叉樹C++
- 8. 檢查一棵樹是否是二叉搜索樹
- 9. 找到另一棵樹上的一棵樹的節點
- 10. 檢查一棵樹是否是一棵完美的樹
- 11. SimpleXML:將一棵樹追加到另一棵樹
- 12. OCaml的 - 一棵樹
- 13. 實現一棵葉子樹
- 14. 我想找到一棵樹是否是另一棵樹的子樹,並運行到ArrayList比較prolem
- 15. 如何將一棵樹分割成兩棵子樹
- 16. OrderedDict是一棵樹嗎?
- 17. 我如何合併兩棵二叉樹
- 18. 使用Dynatree將節點從一棵樹移動到另一棵
- 19. 一棵樹的和絃
- 20. 的jQuery得到一棵樹
- 21. 得到一棵樹結構的孩子
- 22. C++繪製一棵樹
- 23. 畫一棵樹使用Qt
- 24. 遍歷一棵n-tree樹
- 25. 構建一棵樹「向後」
- 26. 畫一棵樹 - 安卓
- 27. 歐拉遊覽一棵樹
- 28. 走一棵樹向後SQL
- 29. 排序與像一棵樹
- 30. 創建一棵B型樹