二叉樹遍歷之非遞迴演算法

2021-06-08 12:42:47 字數 2251 閱讀 6025

**:

先序遍歷非遞迴訪問,使用棧即可實現。先序遍歷的非遞迴訪問在所有的遍歷中算是最簡單的了。主要思想就是先將根結點壓入棧,然後根結點出棧並訪問根結點,而後依次將根結點的右孩子、左孩子入棧,直到棧為空為止。**如下:

[cpp]view plain

copy

void

preorderiter(

struct

node *root)  

cout << endl;  

}  

先序遍歷的非遞迴演算法另一演算法,也是用的棧,只是稍微複雜點,當左子樹遍歷完後,需要回溯並遍歷右子樹。

[cpp]view plain

copy

void

preorderiter2(

struct

node *root)  

else

}  cout << endl;  

}  

本演算法有乙個地方要注意的是,每次從棧中pop出結點時,表示該結點以及該的左子樹已經訪問完了,接下來訪問其右子樹。

中序遍歷非遞迴演算法也是採用棧實現,與上面的先序遍歷演算法2類似,只是訪問根結點的時機不同。

[cpp]view plain

copy

void

inorderiter(

struct

node *root)  

else

}  cout << endl;  

}  

當然,中序遍歷非遞迴演算法還有很多種,比如修改二叉樹結點結構加入乙個欄位來標示結點是否被訪問過等,但是都比該演算法複雜,且修改了原來的二叉樹結構,所以在這裡就不囉嗦了,有興趣的可以移步這裡二叉樹非遞迴訪問,後續如果有時間我會對二叉樹遍歷非遞迴演算法通過在結點新增乙個標記的方法再做乙個總結。

後序遍歷的非遞迴演算法較複雜,使用乙個棧可以實現,但是過程很繁瑣,這裡可以巧妙的用兩個棧來實現後序遍歷的非遞迴演算法。注意到後序遍歷可以看作是下面遍歷的逆過程:即先遍歷某個結點,然後遍歷其右孩子,然後遍歷其左孩子。這個過程逆過來就是後序遍歷。演算法步驟如下:

push根結點到第乙個棧s中。

從第乙個棧s中pop出乙個結點,並將其push到第二個棧output中。

然後push結點的左孩子和右孩子到第乙個棧s中。

重複過程2和3直到棧s為空。

完成後,所有結點已經push到棧output中,且按照後序遍歷的順序存放,直接全部pop出來即是二叉樹後序遍歷結果。

[cpp]view plain

copy

void

postorderiter(

struct

node *root)  

while

(!output.empty())   

cout << endl;  

}  

如果不考慮分層換行列印,則用乙個佇列可以很容易的通過非遞迴實現層序遍歷。但是要每列印一層換一行,就顯得稍微複雜了一點。可以有兩種方法,第一種使用兩個佇列,**很簡練,第二種方法則是使用乙個佇列,**稍顯複雜。

第乙個佇列currentlevel用於儲存當前層的結點,第二個佇列nextlevel用於儲存下一層的結點。當前層currentlevel為空時,表示這一層已經遍歷完成,可以列印換行符了。

然後將第乙個空的佇列currentlevel與佇列nextlevel交換,然後重複該過程直到結束。這個演算法比較好理解。

[cpp]view plain

copy

void

levelorderiter(

struct

node* root)  

if(currentlevel.empty())   

}  }  

void

swap(queue<

struct

node *> &curr, queue<

struct

node*> &next)  

}  只使用乙個佇列的話,需要額外的兩個變數來儲存當前層結點數目以及下一層的結點數目。

[cpp]view plain

copy

void

levelorderiter2(

struct

node *root)  

if(nodesincurrentlevel == 0)   

}  }  

二叉樹遍歷 非遞迴演算法

文庫文章 二叉樹前序遍歷 根 左結點 右結點 所以在訪問到乙個節點不為空時 先訪問此結點,然後把此結點的非空右孩子先入棧,然後再把非空左孩子入棧。具體 如下 二叉樹後序非遞迴演算法 第二種思路 要保證根結點在左孩子和右孩子訪問之後才能訪問,因此對於任一結點p,先將其入棧。如果p不存在左孩子和右孩子,...

二叉樹遍歷非遞迴演算法

輸入 include include define maxsize 100 typedef char elemtype using namespace std typedef struct node btnode 建立二叉樹 void createbtnode btnode b,char str j...

二叉樹遍歷非遞迴演算法

遞迴演算法非常的簡單。先訪問跟節點,然後訪問左節點,再訪問右節點。如果不用遞迴,那該怎麼做呢?仔細 一.先序遍歷 看一下遞迴程式,就會發現,其實每次都是走樹的左分支 left 直到左子樹為空,然後開始從遞迴的最深處返回,然後開始恢復遞迴現場,訪問右子樹。由於一直走到最左邊後,需要逐步返回到父節點訪問...