二叉樹遍歷的棧理解

2021-10-21 16:42:47 字數 1352 閱讀 1232

#include

using

namespace std;

class

treenode

;void

gentree

(treenode*

&root)

else

}void

inorder

(treenode* root)

else

}int

main()

壓棧根節點(root->value = 5)

壓棧根節點的左子樹根節點(root->left->value=3)

壓棧根節點的左子樹的左子樹的根節點(root->left->left->value=2)

壓棧根節點的左子樹的左子樹的左子樹的根節點 (root->left->left->left->value=null)

由於判空,還原到之前的地方

出棧根節點的左子樹的左子樹的左子樹的根節點

出棧根節點的左子樹的左子樹的根節點(root->left->left),並且列印2

壓棧根節點的左子樹的左子樹的右子樹的根節點(root->left->left->right->value=null)

判空還原

由於現在棧頂為(root->left->left->right),棧內第二個是root->left(3)

出棧root->left,列印3,此時棧內只剩下root

壓棧root->left->right(root->left->right->value=4)

壓棧root->left->right->left(null)

由於判空,出棧root->left->right->left

出棧root->left->right,列印4,此時棧內只剩下root

壓棧root->left->right->right(null)

由於判空,出棧root->left->right->right

出棧root,列印5,此時棧內為空

壓棧root->right

壓棧root->right->left

由於判空,出棧root->right->left

出棧root->right,列印7

壓棧root->right->right

壓棧root->right->right->left

由於為空,出棧root->right->right->left

出棧root->right->right,列印8,此時棧內為空

壓棧root->right->right->right

由於判空,出棧root->right->right->right

執行完畢,此時棧內為空,且遞迴無壓棧

二叉樹遍歷理解

口訣 前序遍歷 根結點 左子樹 右子樹 中序遍歷 左子樹 根結點 右子樹 後序遍歷 左子樹 右子樹 根結點 層次遍歷 僅僅需按層次遍歷就可以 二叉樹的遍歷,是從左到右的,前 中 後這三個字代表著根結點的位置 其實也是最終根結點的位置 再次看到前序遍歷,前 就代表根結點在前,然後從左到右,就是 根結點...

二叉樹的遍歷 (遞迴 棧)

二叉樹的遍歷可分為兩種 深度遍歷和廣度遍歷 深度遍歷又分為三種 前序 中序 後序遍歷,這三種遍歷方式可以用遞迴或棧來實現 廣度遍歷 即層序遍歷,可以用佇列來實現 以如下的二叉樹為例,遍歷該二叉樹。a.建立節點類 public class treenode b.根據二叉樹圖建立節點集合 public ...

層次遍歷二叉樹和採用棧的方式遍歷二叉樹

中序遍歷非遞迴 override public void inorderbystack if stack.isempty system.out.println 層次遍歷二叉樹 private void preorderbystack node root2 queuequeue new linkedl...