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

来源:互联网 发布:绿色版软件制作工具 编辑:程序博客网 时间:2024/05/22 03:52

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

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

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

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

代码

#include<stdio.h>#include<malloc.h> #define max 100typedef 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函数计算二叉树的深度,使用的是递归的思想。

总结
本次实验的目的是二叉树的应用,树的深度求值使用递归不算复杂。对于一个无序二叉树而言,层次遍历可以做到对无序二叉树的查找,当然,递归应该也是可以的,但我没有做出来,下次有机会再来好好探究一下。

阅读全文
0 0