实验3 二叉树的遍历

【实验内容】
创建一个二叉树,对这棵动态二叉树进行分析,将其用静态二叉链表表示。二叉树的动态二叉链表结构中的每个结点有三个字段: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;
}


评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值