二叉树的四种遍历方法和两种求深度的方法.docx
《二叉树的四种遍历方法和两种求深度的方法.docx》由会员分享,可在线阅读,更多相关《二叉树的四种遍历方法和两种求深度的方法.docx(11页珍藏版)》请在冰豆网上搜索。
二叉树的四种遍历方法和两种求深度的方法
二叉树的四种遍历方法和两种求深度的方法
二叉树的四种遍历方法和两种求深度的方法
用到了以前学的栈和队列的知识,也算是一种复习。
不过用到栈来求深度的时候,改变了二叉树,不知道如何去避免?
//二叉树.cpp:
定义控制台应用程序的入口点。
#include"stdafx.h"
#include"stdio.h"
#include"stdlib.h"
typedefstructBiTNode{//二叉树结构
intdata;
structBiTNode*lchild,*rchild;
}BiTNode,*BiTree;
#defineSTACK_INIT_SIZE100
#defineSTACKINGMENT10
return0;
}
else
return1;
}
intInOrderTraverse(BiTreeT,int(*PrintfElement)(int))//中序遍历二叉树的递归方法
{
if(T)
{
if(InOrderTraverse(T->lchild,PrintfElement))
if(PrintfElement(T->data))
if(InOrderTraverse(T->rchild,PrintfElement))
return1;
return0;
}
else
return1;
}
intPostOrderTraverse(BiTreeT,int(*PrintfElement)(int))//后序遍历二叉树的递归方法
{
if(T)
{
if(PostOrderTraverse(T->lchild,PrintfElement))
if(PostOrderTraverse(T->rchild,PrintfElement))
if(PrintfElement(T->data))
return1;
return0;
}
else
return1;
}
/*typedefstruct{//栈
BiTree*base;
BiTree*top;
intstacksize;
}SqStack;
intInitStack(SqStack**s)//建立空栈
{
(*s)->base=(BiTree*)malloc(STACK_INIT_SIZE*sizeof(BiTNode*));
if(!
((*s)->base))
return0;
(*s)->top=(*s)->base;
(*s)->stacksize=(*s)->stacksize;
return0;
}
intPush(SqStack*s,BiTreeT)//压栈
{
if(s->top-s->base>=STACK_INIT_SIZE)
{
s->base=(BiTree*)realloc(s->base,(STACK_INIT_SIZE+STACKINGMENT)+sizeof(BiTNode*));
s->top=s->base+STACK_INIT_SIZE;
s->stacksize+=STACK_INIT_SIZE;
}
*s->top++=T;
return0;
}
BiTreePop(SqStack*s,BiTreeT)//出栈,后返回栈顶元素
{
if(s->base==s->top)
{
printf("已空!
");
return0;
}
T=*(--s->top-1);
returnT;
}
//此方法过后二叉树就被改变了。
intDeepBiTree(BiTreeT)//二叉树的深度
{
BiTreep=T;
SqStack*s,a;
intdeep=1,max=0,k=0,b=-2,i=0,j=0;
s=&a;
InitStack(&s);
Push(s,T);
if(T->rchild==NULL)
b++;
while(b)
{
if(p->lchild)
{
if(0==k)
{
p=p->lchild;
j=1;//表记走过左子树
}
else
{
p=p->rchild;
k=0;
i=1;
}
Push(s,p);
deep++;
if(deep>max)
max=deep;
}
else
{
if(p->rchild!
=NULL)
{
i=1;
p=p->rchild;
Push(s,p);
deep++;
if(deep>max)
max=deep;
}
else
{
p=Pop(s,p);
deep--;
k=1;
if(i)//把走过的子树置为空,以后不再走
p->rchild=NULL;
if(j)
p->lchild=NULL;
i=j=0;
}
}
if(p==T)
b++;
}
free(s->base);
returnmax;
}*/
intDeepBiTree(BiTreeT)//求二叉树的深度
{
intldeep,rdeep;
if(!
T)
return0;//空二叉子树深度为0
else
{
ldeep=DeepBiTree(T->lchild);//先序遍历二叉树谨记:
递归是把问题分解成一个最小的单元,例如这里求二叉树的深度就是
rdeep=DeepBiTree(T->rchild);//左二叉子树的深度和右二叉子树的深度作比较,取大的那个加一就是此二叉树的深度。
}
if(ldeep>rdeep)//ldeep就是每个“二叉树”的左子树深度。
returnldeep+1;//rdeep就是每个“二叉树”的右子树深度。
else
returnrdeep+1;
}
typedefstructQNode{
BiTreedata;
structQNode*next;
}QNode,*QueuePtr;
typedefstruct{
QueuePtrfront;
QueuePtrrear;
}LinkQueue;
intInitQueue(LinkQueue**Q)//建立空队列
{
(*Q)->rear=(*Q)->front=(QueuePtr)malloc(sizeof(QNode));//给对头分配空间
if(!
(*Q)->front)
return0;
(*Q)->front->next=NULL;//队尾指向空
return0;
}
intDestoryQueue(LinkQueue*Q)
{
while(Q->front)//对头不为空则继续删除
{
Q->rear=Q->front->next;//保留对头后一个队员,留出对头以便删除
free(Q->front);//删除原对头结点
Q->front=Q->rear;//指向新对头
}
return0;
}
intEnQueue(LinkQueue*Q,BiTreeT)//插入新队员切记队列在队尾插入。
{
QueuePtrp;
if(!
(p=(QueuePtr)malloc(sizeof(QNode))))//生成新结点(不要搞错结点的类型)
return0;
p->data=T;//给新结点赋值
p->next=NULL;//新结点指向空
Q->rear->next=p;//队尾指向新结点
Q->rear=p;//新队尾既是刚插入的结点
return0;
}
BiTreeDeQueue(LinkQueue*Q,BiTreeT)//在对头删除
{
QueuePtrp=Q->front->next;//辅助指针标记要删除的队员
if(Q->front==Q->rear)//空队列不予删除
{
printf("队列已空,无法删除!
\n");
return0;
}
T=p->data;//提取要删除的队员
Q->front->next=p->next;//删除对头结点
if(Q->rear==p)//若队列已空
Q->rear=Q->front;//则对头等于队尾
free(p);//删除结点
returnT;
}
//队列使用注意:
在对头删除,在队尾插入,对头没有指向数据,而队尾有,空队列对头等于队尾。
intLevelOrderTraverse(BiTreeT,int(*PrintfElement)(int))//层序遍历二叉树
{
LinkQueue*Q,a;
Q=&a;
BiTreep=T;
InitQueue(&Q);
if(!
T)//空二叉树结束
return0;
PrintfElement(p->data);//首先输出根结点
if(p->lchild)//若左孩子存在则把左孩子插入队列
EnQueue(Q,p->lchild);
if(p->rchild)//若右孩子存在则把右孩子插入队列
EnQueue(Q,p->rchild);
while(Q->front!
=Q->rear)//队列不为空
{
p=DeQueue(Q,p);//删除对头
PrintfElement(p->data);//输出结点
if(p->lchild)//同上
EnQueue(Q,p->lchild);
if(p->rchild)
EnQueue(Q,p->rchild);
}
DestoryQueue(Q);//销毁队列
return0;
}
intmain()
{
int(*p)(int);//函数类型指针
intdeep;
BiTreeT;
BiTNodes;
T=&s;
p=PrintfElement;
printf("输入字符建立二叉树:
");
CreateBiTree(&T);
printf("先序遍历输出二叉树:
");
PreOrderTraverse(T,p);
printf("\n中序遍历输出二叉树:
");
InOrderTraverse(T,p);
printf("\n后序遍历输出二叉树:
");
PostOrderTraverse(T,p);
deep=DeepBiTree(T);
printf("\n二叉树的深度:
%d\n",deep);
printf("层序遍历输出二叉树;");
LevelOrderTraverse(T,p);
return0;
}