二叉樹非遞迴遍歷:
總體**如下:
#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次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...