這篇博文主要是研究二叉樹遍歷的遞迴與非遞迴演算法,有興趣的小夥伴可以了解下!
二叉樹的遞迴遍歷(深度優先遍歷)
先來張圖,看看各結點遍歷時的情況:
二叉樹深度優先遍歷總結(分別為第一次,第二次,第三次進入某個結點):
先序遍歷:先訪問根結點,然後先序遍歷左子樹,最後先序遍歷右子樹;根->左->右
中序遍歷:先中序遍歷左子樹,然後訪問根結點,最後中序遍歷右子樹;左->根->右
後續遍歷:先後序遍歷左子樹,然後後序遍歷右子樹,最後訪問根結點;左->右->根
遞迴遍歷內部有系統棧,其作用:
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.中序遍歷 規則是若樹為空,則空操作返回,否則從根節點開...
資料結構 遍歷二叉樹
二叉樹的遍歷 是指從根結點出發,按照某種次序依次訪問二叉樹中的所有結點,使得每個結點被訪問一次且僅被訪問一次。訪問其實是要根據實際的需要來確定具體做什麼,比如對每個結點進行相關計算,輸出列印等。它算作是乙個抽象操作。二叉樹的遍歷次序不同於線性結構,最多也就是從頭到尾 迴圈和雙向等簡單的遍歷方式。樹的...