二叉树的四种遍历方法和两种求深度的方法.docx

上传人:b****5 文档编号:8288080 上传时间:2023-01-30 格式:DOCX 页数:11 大小:56.79KB
下载 相关 举报
二叉树的四种遍历方法和两种求深度的方法.docx_第1页
第1页 / 共11页
二叉树的四种遍历方法和两种求深度的方法.docx_第2页
第2页 / 共11页
二叉树的四种遍历方法和两种求深度的方法.docx_第3页
第3页 / 共11页
二叉树的四种遍历方法和两种求深度的方法.docx_第4页
第4页 / 共11页
二叉树的四种遍历方法和两种求深度的方法.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

二叉树的四种遍历方法和两种求深度的方法.docx

《二叉树的四种遍历方法和两种求深度的方法.docx》由会员分享,可在线阅读,更多相关《二叉树的四种遍历方法和两种求深度的方法.docx(11页珍藏版)》请在冰豆网上搜索。

二叉树的四种遍历方法和两种求深度的方法.docx

二叉树的四种遍历方法和两种求深度的方法

二叉树的四种遍历方法和两种求深度的方法

二叉树的四种遍历方法和两种求深度的方法

用到了以前学的栈和队列的知识,也算是一种复习。

不过用到栈来求深度的时候,改变了二叉树,不知道如何去避免?

//二叉树.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;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1