後根遍歷

後根遍歷

簡介後序遍歷是二叉樹遍歷的一種。 後序遍歷有遞歸算法和非遞歸算法兩種。 遞歸算法後根:

簡介

後序遍歷是二叉樹遍歷的一種。後序遍歷指在訪問根結點、遍歷左子樹與遍歷右子樹三者中,首先遍歷左子樹,然後遍歷右子樹,最後遍歷訪問根結點,在遍歷左、右子樹時,仍然先遍歷左子樹,然後遍歷右子樹,最後遍歷根結點。後序遍歷有遞歸算法和非遞歸算法兩種。

遞歸算法
後根: abcd-*+ef/-
算法描述:
(1)若二叉樹為空,結束
(2)後序遍歷左子樹
(3)後序遍歷右子樹
(4)訪問根結點偽代碼
PROCEDURE POSTRAV(BT)
IF BT<>0 THEN
{
POSTRAV(L(BT))
POSTRAV(R(BT))
OUTPUT V(BT)
}
RETURN
c語言描述
struct btnode
{
int d;
struct btnode *lchild;
struct btnode *rchild;
};
void postrav(struct btnode *bt)
{
if(bt!=NULL)
{
postrav(bt->lchild);
postrav(bt->rchild);
printf("%d ",bt->d);
}
}非遞歸算法

算法1(c語言描述):
void postrav1(struct btnode *bt)
{
struct btnode *p;
struct
{
struct btnode *pt;
int tag;
}st&#91;MaxSize&#93;;
}
int top=-1;
top++;
st&#91;top&#93;.pt=bt;
st&#91;top&#93;.tag=1;
while(top>-1) /*不為空*/
{
if(st&#91;top&#93;.tag==1) /*不能直接訪問的情況*/
{
p=st&#91;top&#93;.pt;
top--;
if(p!=NULL)
{
top++; /*根結點*/
st&#91;top&#93;.pt=p;
st&#91;top&#93;.tag=0;
top++; /*右孩子結點*/
st&#91;top&#93;.pt=p->p->rchild;
st&#91;top&#93;.tag=1;
top++; /*左孩子結點*/
st&#91;top&#93;.pt=p->lchild;
st&#91;top&#93;.tag=1;
}
}
if(st&#91;top&#93;.tag==0) /*直接訪問的情況*/
{
printf("%d ",st&#91;top&#93;.pt->d);
top--;
}
}
}
算法2:
void postrav2(struct btnode *bt)
{
struct btnode *st&#91;MaxSize&#93;,*p;
int flag,top=-1;
if(bt!=NULL)
{
do
{
while(bt!=NULL)
{
top++;
st&#91;top&#93;=bt;
bt=bt->lchild;
}
p=NULL;
flag=1;
while(top!=-1 && flag)
{
bt=st&#91;top&#93;;
if(bt->rchild==p)
{
printf("%d ",bt->d);
top--;
p=bt;
}
else
{
bt=bt->rchild;
flag=0;
}
}
}while(top!=-1)
printf("\n");
}
}

相關詞條

相關搜尋

熱門詞條

聯絡我們