二叉樹非遞迴遍歷

2021-10-05 18:06:06 字數 2073 閱讀 2892

二叉樹非遞迴遍歷:

總體**如下:

#include "btree.cpp"

//先序非遞迴遍歷演算法

void preorder1(btnode *b)

if (p->lchild!=null)

} printf("\n"); }}

//中序非遞迴遍歷演算法

void inorder1(btnode *b)

//執行到此處時,棧頂元素沒有左孩子或左子樹均已訪問過

if (top>-1)

} printf("\n"); }}

//後序非遞迴遍歷演算法

void postorder1(btnode *b)

//執行到此處時,棧頂元素沒有左孩子或左子樹均已訪問過

p=null; //p指向棧頂結點的前乙個已訪問的結點

flag=1; //設定b的訪問標記為已訪問過

while (top!=-1 && flag)

else

}} while (top!=-1);

printf("\n");

} }int main()

先序遍歷非遞迴演算法:

演算法思想:

用棧來消除遞迴,先將根節點進棧,在棧不空時候迴圈:出棧p,訪問*p節點,若其右孩子節點不空,將右孩子節點進入堆疊,若其左孩子節點不空,將其左孩子節點進入堆疊。演算法如下:

void preorder1(btnode *b)	

if (p->lchild!=null)

} printf("\n");

}}

中序遍歷非遞迴演算法:

演算法思想:

由中序遍歷的過程可知,中序序列的開始節點是一顆二叉樹的最左下節點。因此,我們的基本思路是,先找到二叉樹的開始節點,並且訪問它,再處理右子樹。

用指標指向當前要處理的節點,先掃瞄(並非訪問)根節點的所有左節點,並且將它們一一進棧,當無左節點時,表示棧頂節點無左子樹,然後出棧這個節點,並訪問它,將p指向剛出棧節點的右孩子,對右子樹進行同樣的處理。 

需要特別注意的是,當節點*p的所有左節點進棧後,這時的棧頂節點要麼沒有左子樹,要麼左子樹已經被訪問過,就可以訪問這個棧頂節點,如此重複操作,直到棧空為止。演算法如下:

//中序非遞迴遍歷演算法

void inorder1(btnode *b)

//執行到此處時,棧頂元素沒有左孩子或左子樹均已訪問過

if (top>-1)

} printf("\n");

}}

後續遍歷非遞迴演算法:

演算法思路:

後續遍歷中第乙個訪問的節點是二叉樹的最左下節點。由於首先訪問節點的左右子樹,然後才訪問節點本身,所以對於任意節點,必須直到其左右子樹是否被訪問過。

使用棧來儲存需要返回的節點的指標,先掃瞄根節點的所有左孩子節點,並且一一進棧,出棧乙個節點*p作為當前節點,然後掃瞄該節點的右子樹,當乙個節點的左右孩子節點均被訪問後再訪問該節點,如此重複,直到棧空為止。

q:如何判斷乙個節點*b的右子樹已經訪問過?

a:如果右孩子節點已經訪問過,則其右子樹就已經訪問過。 

用p指標儲存剛訪問過得節點,若b->rchild==p成立,則b的左右子樹均已訪問,現在應該訪問*b。所以棧中儲存的是當前節點*b的所有祖先節點。這些祖先節點均未被訪問過。

演算法如下:

//後序非遞迴遍歷演算法

void postorder1(btnode *b)

//執行到此處時,棧頂元素沒有左孩子或左子樹均已訪問過

p=null; //p指向棧頂結點的前乙個已訪問的結點

flag=1; //設定b的訪問標記為已訪問過

while (top!=-1 && flag)

else

}} while (top!=-1);

printf("\n");

} }

後序非遞迴遍歷演算法特點:當訪問某個節點時,堆疊中儲存的正好是該節點的所有祖先節點,從棧頂到棧底正好是該節點的雙親  節點到根節點路徑上的節點序列。

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...

非遞迴遍歷二叉樹

中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...