实验三 二叉树的遍历(改良版)

#include<stdio.h>
#include<stdlib.h>
#define MAX 9

typedef struct node//结点结构
{
    char data;//数据域
    struct node *lchild;//左孩子指针
    struct node *rchild;//右孩子指针
}BiTNode,*BiTree;//树中结点类型

typedef struct BiTNode_s//树结构
{
    char data;
    int lchild;//左孩子下标
    int rchild;//右孩子下标

    BiTNode_s():lchild(-1),rchild(-1){}
}BiTNode_s,*BiTree_s;



int i=1;

//前序法构建二叉树
void PreCreatBiTree(BiTree&T)
{
    //按先序次序输入二叉树中结点的值(一个字符),创建二叉链表表示的二叉树T
    char ch;//结点的值
    if((ch=getchar())=='*')//用*表示空
        T=NULL;//递归结束,建空树
    else
    {
        T=(BiTNode *)malloc(sizeof(BiTNode));//开辟新的空间
        T->data=ch;//生成根结点赋值
        PreCreatBiTree(T->lchild);//递归创建左子树
        PreCreatBiTree(T->rchild);//递归创建右子树
    }
}

//前序遍历,中左右
void PreTravel(BiTree &T)
{
    if(T)
    {
        printf("%c ",T->data); //中
        PreTravel(T->lchild); //先左子树
        PreTravel(T->rchild); //后右子树
    }
}

//中序遍历,左中右
void MidTravel(BiTree&T)
{
    if(T)
    {
        MidTravel(T->lchild);
        printf("%c ",T->data);
        MidTravel(T->rchild);
    }
}

//后序遍历,左右中
void AftTravel(BiTree &T)
{
    if(T)
    {
        AftTravel(T->lchild);
        AftTravel(T->rchild);
        printf("%c ",T->data);
    }
}

//后序遍历将动态二叉树转化为用静态二叉链表
void TreeToArray(BiTree &T,BiTNode_s a[])
{
    int k,t; //k用于记录递归调用的每一层此结点对应的数组下标,i在外面就被初始化为1,t用来记录未被赋值的左孩子的下标
    if(T->lchild)
    {

        TreeToArray(T->lchild,a); //递归调用Tree_to_Array函数
        k=i;
        i++;
        a[i].lchild = k; //将左孩子结点对应的下标赋给双亲结点
        t=k;
    }
    else{
        a[i].lchild = 0; //没有左孩子结点
        t=0;
    }
    if(T->rchild){
         TreeToArray(T->rchild,a); //递归调用Tree_to_Array函数
         k=i;
         i++;
         a[i].rchild = k; //将右孩子结点对应的下标赋给双亲结点的rcjild
         if(a[i].lchild==-1) //判断是否存在左孩子未指定的情况
         {
             a[i].lchild = t;
         }
    }
    else
    {
        a[i].rchild = 0; //没有右孩子结点
    }
    a[i].data=T->data;
}

int main()
{
    int j;
    BiTree T;
    BiTNode_s a[MAX];
    printf("请按先序遍历顺序输入二叉树的各节点,没有的用符号*代替:\n");
    PreCreatBiTree(T);
   /* printf("前序遍历结果:\n");
    PreTravel(T);*/
    printf("\n");
    printf("中序遍历结果:\n");
    MidTravel(T);
    printf("\n");
    /*printf("后序遍历结果:\n");
    AftTravel(T);*/
    printf("\n");
    TreeToArray(T,a);
    printf("后序遍历转化成静态二叉链表为:\n");
    for(j=1;j<MAX;j++)
        printf("下标:%d 数据:%c 左孩子:%d 右孩子:%d\n",j,a[j].data,a[j].lchild,a[j].rchild);

    return 0;
}

//ABCD***E**FG*H***
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值