动态二叉链表的遍历和转换成静态二叉链表


//动态二叉树的先根遍历,中根遍历、后根遍历和转换成静态二叉链表



代码:

#include<stdio.h>
#include<stdlib.h>
#define N 20
typedef struct node                          //节点创建
{
    char data;
    struct node *lchild,*rchild;
    int index;
}Binary_Tree;
typedef struct tree                          //静态二叉树结点
{
    char data;
    int lchild;
    int rchild;
}Treenode;


static int i=0,n=0;
Binary_Tree *Create_actiontree()                        //用递归方法创建树
{
    Binary_Tree *Tree;
    char c;
    scanf("%c",&c);
    if(c==' ')
        Tree=NULL;
    else
    {
        Tree=(Binary_Tree*)malloc(sizeof(Binary_Tree));
        Tree->data=c;
        Tree->index=i++;


        Tree->lchild=Create_actiontree();              //递归左子树
        Tree->rchild=Create_actiontree();              //递归右子树
    }
    return Tree;
}


void prioritiesTraverse(Binary_Tree *Tree)          //递归方法先序遍历
{
    if(Tree)
    {
        printf("%c ",Tree->data);
        prioritiesTraverse(Tree->lchild);
        prioritiesTraverse(Tree->rchild);
    }
}


void middleTraverse(Binary_Tree *Tree)            //递归方法中序遍历
{
    if(Tree)
    {
        middleTraverse(Tree->lchild);
        printf("%c ",Tree->data);
        middleTraverse(Tree->rchild);
    }
}


void lastTraverse(Binary_Tree *Tree)         //递归方法后序遍历
{
    if(Tree)
    {
        lastTraverse(Tree->lchild);
        lastTraverse(Tree->rchild);
        printf("%c ",Tree->data);
    }
}




static int j=0;
void Create_quiettree(Binary_Tree *Tree,Treenode a[])              //将动态二叉树转换成静态二叉链表
{
    a[j].data=Tree->data;
    if(Tree->lchild==NULL)
        a[j].lchild=0;
    else
        a[j].lchild=Tree->lchild->index;
    if(Tree->rchild==NULL)
        a[j].rchild=0;
    else
        a[j].rchild=Tree->rchild->index;
    j++;
    if(Tree->lchild!=NULL)
        Create_quiettree(Tree->lchild,&a[0]);
    if(Tree->rchild!=NULL)
        Create_quiettree(Tree->rchild,&a[0]);
}


void main()
{


    Binary_Tree *T;
    Treenode a[N];
    printf("请输入二叉树的节点数据,类型为字符型,当为空时用空格代替:");
    T=Create_actiontree();
    Create_quiettree(T,&a[0]);


    printf("先序遍历:");
    prioritiesTraverse(T);
     printf("\n");
      printf("中序遍历:");
    middleTraverse(T);
    printf("\n");
     printf("后序遍历:");
    lastTraverse(T);
    printf("\n\n");
    printf("说明:当左孩子或右孩子为空时,用0填充\n\n");
     printf("静态二叉链表为:\n");
    printf("i\tdata\tlchild\trchild\t\n");
    int m;
    for(m=0;m<i;m++)
    {
        printf("%d\t%c\t%d\t%d\n",m,a[m].data,a[m].lchild,a[m].rchild);
    }


}



运行截图:







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值