严蔚敏视频 笔记20
遍历算法的应用举例
1.统计二叉树中叶子结点的个数(先序遍历)
void CountLeaf(BiTree T,int &count) {
if(T) {
if((!T->lchild)&&(!T->rchild)) count++;
CountLeaf(T->lchild,count);
CountLeaf(T->rchild,count);
}
}
2.求二叉树的深度(后序遍历)
int Depth(BiTree T) {
if(!T) depthval=0;
else {
depthLeft=Depth(T->lchild);
depthRight=Depth(T->rchild);
depthval=1+(depthLeft>depthRight)?depthLeft:depthRight;
}
return depthval;
}
3.复制二叉树(后序遍历)
// 生成一个二叉树的结点
BiTNode * GetTreeNode(TElemType item,BiTNode *lptr,BiTNode *rptr) {
if(!(T=(BiTNode *)malloc(sizeof(BiTNode))))
exit(1);
T->data=item;
T->lchild=lptr;
T->rchild=rptr;
return T;
}
BiTNode * CopyTree(BiTNode *T) {
if(!T) return NULL;
if(T->lchild) newlptr=CopyTree(T->lchild);
else newlptr=NULL;
if(T->rchild) newrptr=CopyTree(T->rchild);
else newrptr=NULL;
newnode=GetTreeNode(T->data,newlptr,newrptr);
return newnode;
}
4.建立二叉树的存储结构
按给定的先序序列建立二叉链表
Status CreateBiTree(BiTree &T) {
scanf(&ch);
if(ch==' ') T=NULL;
else {
if(!(T=(BiTNode *)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
T->data=ch; // 生成根结点
CreateBiTree(T->lchild); // 构造左子树
CreateBiTree(T->lchild); // 构造右子树
}
return OK;
}
空格代表空树
按给定的表达式建立二叉树
由先缀表达式建树
void CrtExptree(BiTree &T,char exp[]) {
InitStack(S); Push(S,"#"); InitStack(PTR);
p=exp; ch=*p;
while(!(GetTop(S)=='#'&&ch=='#')) {
if(!IN(ch,OP)) CrtNode(t,ch); // 建立叶子结点并入栈
else {
switch(ch) {
case '(': Push(S,ch); break;
case ')':
{
Pop(S, c);
while (c!='(' ) {
CrtSubtree(t,c); Pop(S,c);
}
break;
}
default:
{
while(!Gettop(S,c)&&(precede(c,ch))) {
CrtSubtree(t,c); Pop(S,c);
}
if ( ch!='#') Push(S,ch);
break;
}
}
}
if(ch!='#') { p++; ch=*p;}
}
Pop(PTR,T);
}
建立叶子结点的算法
void CrtNode(BiTree &T,char ch) {
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=ch;
T->lchild=T->T-rchild=NULL;
Push(PTR,T);
}
建立子树的算法
void CrtSubtree(BiTree &T,char ch) {
T=(BiTNode *)malloc(sizeof(BiTNode));
T->data=ch;
Pop(PTR,rc); T->rchild=rc;
Pop(PTR,lc); T->lchild=lc;
Push(PTR,T);
}
本文详细介绍了二叉树遍历算法的应用,包括统计叶子节点个数、求树深度、复制树和根据先序序列建立二叉树等实例。重点展示了通过先序、后序遍历实现不同功能的代码逻辑。
2万+

被折叠的 条评论
为什么被折叠?



