任何人都可以給我一個解決方案遍歷二進制樹inorder沒有遞歸和沒有使用堆棧?我可以在沒有遞歸和堆棧的情況下遍歷二叉樹嗎?
4
A
回答
4
第二個編輯:我認爲這是對的。除了通常的node.left_child和node.right_child之外,還需要node.isRoot,node.isLeftChild和node.parent。
state = "from_parent"
current_node = root
while (!done)
switch (state)
case "from_parent":
if current_node.left_child.exists
current_node = current_node.left_child
state = "from_parent"
else
state = "return_from_left_child"
case "return_from_left_child"
if current_node.right_child.exists
current_node = current_node.right_child
state = "from_parent"
else
state = "return_from_right_child"
case "return_from_right_child"
if current_node.isRoot
done = true
else
if current_node.isLeftChild
state = "return_from_left_child"
else
state = "return_from_right_child"
current_node = current_node.parent
0
由於遍歷一個binary tree需要某種狀態(在訪問後繼之後返回節點),這可以由遞歸暗示的堆棧提供(或由數組顯式)。
答案是否定的,你不能。 (按照傳統的定義)
的最接近二叉樹遍歷迭代的方式則可能使用heap
編輯: 或者作爲已經顯示出一個threaded binary tree,
+0
一個線程樹似乎符合Gogu的要求。 – 2010-04-07 19:01:32
0
是的,你可以。爲了做到這一點,你需要一個父指針來升級樹。
-1
正如這裏已經有人說過的,這是可能的,但不是沒有父指針。如果需要,父指針基本上允許您遍歷「路徑」,因此可以打印出節點。 但爲什麼遞歸沒有父指針?那麼,如果你瞭解它遞歸去這樣的事情(想象中的遞歸棧):
recursion //going into
recursion
recursion
recursion
recursion //going back up
recursion
recursion
recursion
所以當遞歸結束你就必須打印二叉樹的選擇面相反的順序。
0
從tree_first()開始,繼續使用tree_next(),直到獲得NULL。 Full code:https://github.com/virtan/tree_closest
struct node {
int value;
node *left;
node *right;
node *parent;
};
node *tree_first(node *root) {
while(root && root->left)
root = root->left;
return root;
}
node *tree_next(node *p) {
if(p->right)
return tree_first(p->right);
while(p->parent) {
if(!p->parent->right || p->parent->right != p)
return p->parent;
else p = p->parent;
}
return 0;
}
相關問題
- 1. 遞歸遍歷二叉樹
- 2. 非遞歸PostOrder使用並行堆棧的二叉樹遍歷
- 3. 遍歷一個沒有遞歸和堆棧的文件樹Java
- 4. C中沒有遞歸和堆棧的遍歷樹C
- 5. 如何在不遞歸的情況下遍歷二叉搜索樹?
- 6. 遞歸函數來遍歷二叉樹
- 7. 遞歸遍歷二叉查找樹
- 8. 沒有遞歸/堆棧使用(C#)的樹遍歷?
- 9. 二叉樹 - 如何遍歷遞歸沒有任何參數
- 10. 使用堆棧的二叉搜索樹的樹遍歷算法
- 11. 二叉樹遍歷的遞歸VS非遞歸
- 12. 二叉樹遍歷
- 13. 二叉樹遍歷
- 14. 遍歷二叉樹
- 15. 遍歷二叉樹
- 16. Morris遍歷與二叉樹遞歸有序的性能
- 17. 遞歸和在二叉樹
- 18. 從預先遍歷構建二叉樹:堆棧溢出錯誤
- 19. 如何通過二叉搜索樹遍歷在Python(沒有遞歸)
- 20. 無遞歸的二叉樹遍歷的直觀解釋
- 21. 尾遞歸遍歷樹沒有循環
- 22. 遍歷非二叉樹的最壞情況
- 23. 樹遍歷遞歸
- 24. O(n)遍歷二叉樹的非遞歸過程
- 25. Java遞歸和二叉樹
- 26. 遞歸和二叉樹
- 27. 用堆棧替換遞歸DFS樹遍歷?
- 28. 解釋Morris inorder樹遍歷而不使用堆棧或遞歸
- 29. 可以按順序對非二叉樹進行遍歷嗎?
- 30. python如何遍歷二叉搜索樹使用inorder/pre/post /沒有遞歸?
一個線程化的二叉樹? – 2010-04-07 18:42:49
如果你能做到這一點,它不會是二叉樹 – vittore 2010-04-07 18:46:57
這不是一個功課嗎? 在你的情況下,計數器是否被視爲堆棧? – 2010-04-07 18:53:18