非遞迴前序
void
preorder
(bnode *root)
printf
("%d "
, root->data)
;//先列印根節點
preorder
(root->left)
;//列印左子樹
preorder
(root->right)
;//列印右子樹
}
中序void
inorder
(bnode *root)
preorder
(root->left)
;//先列印左子樹
printf
("%d "
, root->data)
;//列印根節點
preorder
(root->right)
;//列印右子樹
}
後序void
postorder
(bnode *root)
preorder
(root->left)
;//先列印左子樹
preorder
(root->right)
;//列印右子樹
printf
("%d "
, root->data)
;//列印根節點
}
前序
如果不用遞迴的話,我們能想到的一定會用到迴圈,那麼如何來儲存這些結點?可以用棧,因為用迴圈,肯定要從根節點開始,當迴圈到某乙個結點時,我們只會對該結點及其子樹進行操作,就利用到了棧的特性。
在壓棧的時候,一直都是先壓左子樹,因為在遍歷中,左孩子一定在右孩子的前面
對於前序遍歷,先列印根節點,因為壓棧就是從根節點開始的,一直壓左孩子,當左孩子為空時,就讓棧頂元素出棧,並開始壓右孩子
void
preorder
(bnode *root)
top =
stacktop
(&stack)
;stackpop
(&stack)
; node = top->right;
}}
中序void
inorder
(bnode *root)
top =
stacktop
(&stack)
;printf
("%d "
, top->data)
;stackpop
(&stack)
; node = top->right;
}}
後序void
postorder
(bnode *root)
top =
stacktop
(&stack);if
(top->right ==
null
|| top->right == last)
else
}}
前序 中序 後序 非遞迴 實現
1.簡述 void preorder node root 3.中序非遞迴 前序中的root主要作為中間變數使用。這裡的root的意義是下乙個要進棧的結點,初始值為根結點。while root不為空 棧不為空 void inorder node root else 4.後序非遞迴 root表示下乙個要...
前序 中序 後序 非遞迴 實現
1.簡述 void preorder node root 3.中序非遞迴 前序中的root主要作為中間變數使用。這裡的root的意義是下乙個要進棧的結點,初始值為根結點。while root不為空 棧不為空 else 4.後序非遞迴 root表示下乙個要處理的結點,初始化為根結點,per表示上一次剛...
前序中序後序遍歷遞迴非遞迴實現
根 左兒子 右兒子 definition for binary tree struct treenode void preorder treenode root,vector v 非遞迴遍歷時就是模擬棧,注意入棧順序即可 void preorder treenode root,vector v 左二...