中序后序遍历
知識(shí)點(diǎn)總結(jié)報(bào)告
知識(shí)點(diǎn):
中序遍歷
(原理)中序遍歷二叉樹過程
(1)中序遍歷左子樹
(2)訪問根結(jié)點(diǎn)
(3)中序遍歷右子樹
中序遍歷遞歸算法
void InOrder(BTNode *b)???????? //中序遍歷的遞歸算法
{ if (b!=NULL)
{ InOrder(b->lchild);???? //遞歸訪問左子樹
? ?printf("%c ",b->data);? //訪問根節(jié)點(diǎn)
??InOrder(b->rchild);???? //遞歸訪問右子樹
? }
}
中序遍歷非遞歸算法
void InOrder1(BTNode *b) //中序遍歷非遞歸算法
{ BTNode *p;
SqStack *st; //定義一個(gè)順序棧指針st
InitStack(st); //初始化棧st
p=b;
while(!StackEmpty(st)||p!=NULL)
{ while(p!=NULL) //掃描結(jié)點(diǎn)p的所有左下結(jié)點(diǎn)并進(jìn)棧
{ Push(st,p); //結(jié)點(diǎn)p進(jìn)棧
p=p->lchild; //移動(dòng)到左孩子
}
if(!StackEmpty(st)) //若棧不空
{ Pop(st,p); //出棧結(jié)點(diǎn)p
printf("%c",p->data); //訪問結(jié)點(diǎn)p
p=p->rchild; //轉(zhuǎn)向處理其右子樹
}
}
printf("\n");
DestroyStack(st); //銷毀棧
}
?
?
后序遍歷
(原理)后序遍歷二叉樹過程
(1)后序遍歷左子樹
(2)后序遍歷右子樹
(3)訪問根結(jié)點(diǎn)
后序遍歷遞歸算法
void PostOrder(BTNode *b)?????? //后序遍歷的遞歸算法
{ if (b!=NULL)
?{ PostOrder(b->lchild);?? //遞歸訪問左子樹
?? PostOrder(b->rchild);?? //遞歸訪問右子樹
?? printf("%c ",b->data);? //訪問根節(jié)點(diǎn)
? }
}
后序遍歷非遞歸算法
void PostOrder1(BTNode *b) //后序遍歷非遞歸算法
{ BTNode *p,*r;
SqStack *st; //定義一個(gè)順序棧指針st
InitStack(st); //初始化棧st
p=b;
do
{ while(p!=NULL) //掃描結(jié)點(diǎn)p的所有左下結(jié)點(diǎn)并進(jìn)棧
{ Push(st,p); //結(jié)點(diǎn)p進(jìn)棧
p=p->lchild; //移動(dòng)到左孩子
}
r=NULL; //r指向剛訪問的結(jié)點(diǎn),初始時(shí)為空
Flag=true; //flag為真表示正在處理?xiàng)m斀Y(jié)點(diǎn)
while(!StackEmpty(st)&&flag)
{ GetTop(st,p); //取出當(dāng)前的棧頂結(jié)點(diǎn)p
if(p->rchild==r) //若結(jié)點(diǎn)p的右孩子為空或者為剛剛訪問過的結(jié)點(diǎn)
{ printf("%c",p->data); //訪問結(jié)點(diǎn)p
Pop(st,p);
r=p; //r指向剛訪問過的結(jié)點(diǎn)
}
else
{ p=p->rchild; //轉(zhuǎn)向處理其右子樹
flag=false; //表示當(dāng)前不是處理?xiàng)m斀Y(jié)點(diǎn)
}
}
}while(!StackEmpty(st)); //棧不空循環(huán)
printf("\n");
DestroyStack(st); //銷毀棧
}
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/li1997/p/8409205.html
總結(jié)
- 上一篇: 史上最全Redis面试题及答案。
- 下一篇: 酷狗音乐在线试听下载