实验3 二叉树的遍历

来源:互联网 发布:如何拍淘宝图片 编辑:程序博客网 时间:2024/05/16 14:42

【实验内容】
创建一个二叉树,对这棵动态二叉树进行分析,将其用静态二叉链表表示。二叉树的动态二叉链表结构中的每个结点有三个字段:data,lchild,rchild。静态二叉链表是用数组作为存储空间,每个数组元素存储二叉树的一个结点,也有三个字段:data,lchild,rchild。lchild和rdhild分别用于存储左右孩子的下标。


【实验目的】
1、了解二叉树的前序、中序、后序和层次序列排列;
2、将C语言同二叉树的数据结构联系起来;
3、掌握生成的二叉树的链表结构;
4、掌握如何按层次输出二叉树的所有结点;
5、掌握如何将动态二叉树转换为静态二叉链表。


【实验步骤与要求】
1、实验前的准备
(1)了解二叉树的基本概念;
(2)了解二叉树的基本结构。
2、上机操作
(3)了解二叉树的前序和中序序列排列;
(4)将C语言同二叉树的数据结构联系起来;
(5)掌握生成的二叉树的链表结构;
(6)掌握如何按层次输出二叉树的所有结点;
(7)掌握如何将动态二叉树转换为静态二叉链表。


代码:

#include<stdio.h>#include<string.h>#include<stdlib.h>typedef struct tree{    struct tree *lchild,*rchild;    int data;}Tree;int num[105],dnum[105],maxdeep;//num[i]表示第i层一共的节点个数,dnum[i]表示当前第i层的下标应该从dnum[i]开始放Tree* Build(Tree* p,int deep){    int x;    scanf("%d",&x);    if(x!=0)//输入0代表节点为空,输入的为前序遍历    {        if(deep>maxdeep)//maxdeep记录下最高层            maxdeep=deep;        p=malloc(sizeof(Tree));        p->data=x;        num[deep]++;//deep层数节点数++        p->lchild=Build(p->lchild,deep+1);        p->rchild=Build(p->rchild,deep+1);        return p;    }    else        return NULL;}void bianli(Tree *p)//中序遍历{    if(p!=NULL)    {        bianli(p->lchild);        printf("%d ",p->data);        bianli(p->rchild);    }}typedef struct stree//静态树{    int data;    int lchild,rchild;}Stree;Stree t[1005];int d;void translate(Stree t[],Tree *p,int parent,int tag,int deep)//按照层次遍历的标号来将动态树转化为静态树{    if(p!=NULL)//tag为0即该节点为左儿子,为1为右儿子,deep为当前层数,parent为父亲标号,用于修改父亲的儿子情况    {        int pos=dnum[deep];//该节点放的位置        dnum[deep]++;//该层下一个放的时候放在后一个        t[pos].data=p->data;        t[pos].lchild=0;//先初始化为0        t[pos].rchild=0;        if(tag==0)//该节点为左儿子,修改父节点儿子情况            t[parent].lchild=pos;        else//同上            t[parent].rchild=pos;        translate(t,p->lchild,pos,0,deep+1);//继续遍历树,deep+1        translate(t,p->rchild,pos,1,deep+1);    }}int main(){    int i,n,s=0;    memset(num,0,sizeof(num));//每一层的节点数要初始化    Tree *head;    maxdeep=0;//最大层数初始化    head=Build(head,1);    for(i=1;i<=maxdeep;i++)//处理每一层应该从几开始放    {        dnum[i]=s+1;        s+=num[i];    }//处理完后一个有s个节点    printf("中序遍历:\n");    bianli(head);    printf("\n");    d=1;    translate(t,head,0,0,1);    printf("转化为静态树后的层次遍历:\n");    for(i=1;i<=s;i++)//遍历静态树    {        printf("%d lson:%d rson:%d\n",t[i].data,t[t[i].lchild].data,t[t[i].rchild].data);    }    printf("\n");    return 0;}


阅读全文
0 0