2010-04-07 45 views
4

任何人都可以給我一個解決方案遍歷二進制樹inorder沒有遞歸和沒有使用堆棧?我可以在沒有遞歸和堆棧的情況下遍歷二叉樹嗎?

+1

一個線程化的二叉樹? – 2010-04-07 18:42:49

+0

如果你能做到這一點,它不會是二叉樹 – vittore 2010-04-07 18:46:57

+0

這不是一個功課嗎? 在你的情況下,計數器是否被視爲堆棧? – 2010-04-07 18:53:18

回答

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 
+3

我相當肯定,這將有深度> 2樹木的問題。 – 2010-04-07 19:04:10

+0

你擊敗了我。但是請注意,這隻有在字段node.parent存在的情況下才有效,也就是說,如果節點知道它的父節點。通過二叉樹的定義,這是允許的,但不是必需的。 – Beta 2010-04-07 19:04:54

+0

如果您有node.parent,則不需要node.isRoot。另外,我認爲你可以不使用node.isLeftChild。 – Beta 2010-04-07 20:07:58

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; 
}