mysql 遍歷二叉樹 資料結構 二叉樹遍歷

2021-10-17 21:13:16 字數 3002 閱讀 9100

這篇博文主要是研究二叉樹遍歷的遞迴與非遞迴演算法,有興趣的小夥伴可以了解下!

二叉樹的遞迴遍歷(深度優先遍歷)

先來張圖,看看各結點遍歷時的情況:

二叉樹深度優先遍歷總結(分別為第一次,第二次,第三次進入某個結點):

先序遍歷:先訪問根結點,然後先序遍歷左子樹,最後先序遍歷右子樹;根->左->右

中序遍歷:先中序遍歷左子樹,然後訪問根結點,最後中序遍歷右子樹;左->根->右

後續遍歷:先後序遍歷左子樹,然後後序遍歷右子樹,最後訪問根結點;左->右->根

遞迴遍歷內部有系統棧,其作用:

1.保護現場(類似存檔)

2.恢復現場(類似讀檔)

遞迴遍歷**比較簡單,先、中、後序遍歷遞迴**基本相似,總**:

void r(btnode *p)

if (p != null)

//第一次進入-先序

r(p->lchild);

//第二次進入-中序

r(p->rchild);

//第三次進入-後序

先序遍歷遞迴函式:

void r(btnode *p)

if (p != null)

visit(p);

r(p->lchild);

r(p->rchild);

二叉樹的非遞迴遍歷(深度優先遍歷)

須知:非遞迴需要自定製輔助棧

1.先序遍歷非遞迴:

1).利用輔助棧將根節點入棧,出棧操作,訪問該節點,將其右、左孩子分別入棧(每次訪問節點後,對其左、右孩子需要做乙個檢測,為空的孩子無需入棧)

2).左孩子出棧,訪問該節點,將其右、左孩子分別入棧,多次操作!

3).直至棧空為止(出棧是在迴圈之內執行,即使棧空也會執行右左孩子入棧操作)

void preordernonrecursion(btnode *bt)

if (bt != null)//根節點是否為空

btnode *stack[maxsize];

int top = -1;//建立棧

btnode *p = null;//遍歷指標

stack[++top] = bt;//節點入棧

while(top != -1)//棧不空時迴圈

p = stack[top--];//出棧乙個元素

visit(p);//訪問

if(p->rchild != null)//右孩子不為空就入棧

stack[++top] = p->rchild;

if(p->lchild != null)//左孩子不為空就入棧

stack[++top] = p->lchild;

2.後序遍歷非遞迴:

// 先序(根左右),而後序(左右根),將後序逆轉為逆後序(根右左),逆後序的左右交換即可成為前序(根左右)

// 在這我們可以使用逆後序(根右左),把逆後序的結果壓入乙個新棧,出棧就得到後序遍歷序列

1).將根節點入輔助棧(棧1),出棧操作,將出棧後的該元素入逆序棧(棧2),將其左、右孩子分別入輔助棧(每次對其左、右孩子需要做乙個檢測,為空的孩子無需入棧);

2).右孩子出輔助棧(棧1),將出棧後的該元素入逆序棧(棧2),將其左、右孩子分別入輔助棧(棧1),多次操作;

3).直至輔助棧空為止,出棧是在迴圈之內執行,即使棧空也會執行左右孩子入棧操作;

4).逆序棧(棧2)中元素逐個出棧並訪問

void postordernonrecursion(btnode *bt)

if (bt != null)//根節點不為空

btnode *stack1[maxsize];int top1= -1;//建立棧1(輔助遍歷的棧)

btnode *stack2[maxsize];int top2= -1;//建立棧2(結果逆序的棧)

btnode *p = null;//遍歷指標

stack1[++top1] = bt;//節點入棧1

while(top1 != -1)//棧不空時迴圈

p = stack1[top1--];//棧1出棧乙個元素

stack2[++top2] = p;//出棧元素入棧2

if(p->lchild != null)//左孩子不為空就入棧

stack[++top] = p->lchild;

if(p->rchild != null)//右孩子不為空就入棧

stack[++top] = p->rchild;

while(top2 != -1)

p = stack2[top2--];//棧2元素逐個出棧

visit(p);//訪問

3.中序遍歷非遞迴**

1).從根節點開始,一直左走,並把途徑的左孩子節點入棧;

2).遇到左孩子為空時,棧頂元素出棧,訪問該節點,p指向該節點的右孩子;

3).直到棧空或者p為null則遍歷結束

void inordernonrecursion(btnode *bt)

if(bt != null)//樹不空

btnode *stack[maxsize];int top = -1;//建立棧

btnode *p = null;//遍歷指標

p = bt;//節點入棧1

while(top != -1 || p != null)//棧不空或者p不空

while(p != null)

stack[++top] = p;//入棧

p = p->lchild;//左走

if(top != -1)

p = stack[top--];//出棧

visit(p);//訪問該節點

p = p->rchild;//右走

資料結構 遍歷二叉樹

資料結構實驗之二叉樹二 遍歷二叉樹 time limit 1000ms memory limit 65536kb submit statistic problem description 已知二叉樹的乙個按先序遍歷輸入的字串行,如abc,de,g,f,其中,表示空結點 請建立二叉樹並按中序和後序的方...

資料結構 遍歷二叉樹

二叉樹的遍歷原理 二叉樹的遍歷是指從根節點出發,按照某種次序以此訪問二叉樹所有節點,使得每個節點被訪問一次且僅被訪問一次 二叉樹遍歷方法 1.前序遍歷 規則是若二叉樹為空,則空操作返回,否則先訪問根節點,然後前序遍歷左子樹,再前序遍歷右子樹 2.中序遍歷 規則是若樹為空,則空操作返回,否則從根節點開...

資料結構 遍歷二叉樹

二叉樹的遍歷 是指從根結點出發,按照某種次序依次訪問二叉樹中的所有結點,使得每個結點被訪問一次且僅被訪問一次。訪問其實是要根據實際的需要來確定具體做什麼,比如對每個結點進行相關計算,輸出列印等。它算作是乙個抽象操作。二叉樹的遍歷次序不同於線性結構,最多也就是從頭到尾 迴圈和雙向等簡單的遍歷方式。樹的...