您的位置:首页 > 理论基础 > 数据结构算法

数据结构之树的层次遍历(附带查找)、深度求值

2017-06-30 22:12 465 查看
二叉树的层次遍历,顾名思义就是指从二叉树的第一层(根节点)开始,从上至下逐层遍历,在同一层中,则按照从左到右的顺序对节点逐个访问。

算法思想:用一个队列保存被访问的当前节点的左右孩子以实现层序遍历。

在进行层次遍历的时候,设置一个队列结构,遍历从二叉树的根节点开始,首先将根节点指针入队列,然后从队头取出一个元素,每取一个元素,执行下面两个操作:

1、访问该元素所指向的节点

2、若该元素所指节点的左右孩子节点非空,则将该元素所指节点的左孩子指针和右孩子指针顺序入队。此过程不断进行,当队列为空时,二叉树的层次遍历结束。

代码

#include<stdio.h>
#include<malloc.h>
#define max 100
typedef struct tree
{
char data;
struct tree*lchild;
struct tree*rchild;
}bitree;
bitree*creat()
{
bitree*t;
t=(bitree*)malloc(sizeof(bitree));
char a;
if((a=getchar())=='0')
t=NULL;
else {
t->data=a;
t->lchild=creat();
t->rchild=creat();
}
return t;
}
void print(bitree*t)
{
if(t!=NULL)
{
printf("%c",t->data);
if(t->lchild!=NULL||t->rchild!=NULL)
{
printf("(");
print(t->lchild);
if(t->rchild!=NULL)
printf(",");
print(t->rchild);
printf(")");
}
}
}
int bitreedepth(bitree*t)
{
int ldep,rdep;
if(t==NULL)
return 0;
else {
ldep=bitreedepth(t->lchild);
rdep=bitreedepth(t->rchild);
if(ldep>rdep)
return ldep+1;
else return rdep+1;
}
}
int levelprint(bitree*t,char x)
{
int flag=0;
bitree*q[max];
int front=-1,rear=0;
if(t==NULL)
return 0;
q[rear]=t;
while(front!=rear)
{
front++;
printf("%c",q[front]->data);
if(q[front]->data==x)
flag=1;
if(q[front]->lchild!=NULL)
{
rear++;
q[rear]=q[front]->lchild;
}
if(q[front]->rchild!=NULL)
{
rear++;
q[rear]=q[front]->rchild;
}
}
return flag;
}
int main()
{
bitree*t;
printf("input the bitree:");
t=creat();
putchar('\n');
print(t);
int c=bitreedepth(t);
printf("\nthe bitree depth:%d",c);
fflush(stdin);
char a;
printf("\nyou want to find:");scanf("%c",&a);
int b;
b=levelprint(t,a);
if(b)
puts("\nyou get it");
else puts("\nyou don't get it");
free(t);
return 0;
}


注意:0代表的是NULL





使用说明:本代码,含有levelprint函数,可以层次打印,顺便查找一下关键值。bitreedepth函数计算二叉树的深度,使用的是递归的思想。

总结

本次实验的目的是二叉树的应用,树的深度求值使用递归不算复杂。对于一个无序二叉树而言,层次遍历可以做到对无序二叉树的查找,当然,递归应该也是可以的,但我没有做出来,下次有机会再来好好探究一下。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐