前序 中序 後序遞迴 非遞迴方式列印二叉樹

2021-08-29 02:41:53 字數 1592 閱讀 1009

非遞迴前序

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 左二...