您的位置:首页 > 其它

给定先序:ABCDEFGHIJK 给定中序:CBEDGFAHJIK 首先分析上述给定的先,中序,首先得知先序遍历的肯定是二叉树的根节点:A,在看中序遍历,根据中序遍历的原理可知,在A左边的一定全部属于

2012-09-19 21:23 369 查看
给定先序:ABCDEFGHIJK

给定中序:CBEDGFAHJIK

首先分析上述给定的先,中序,首先得知先序遍历的肯定是二叉树的根节点:A,在看中序遍历,根据中序遍历的原理可知,在A左边的一定全部属于A的左子树,在其右边的肯定属于其右子树。再看序列,先序:BCDEFG,中序:CBEDGF,可以把这两个序列作为遍历一个树的结果,那么同理可知B肯定是此树的根节点,二C属于此树的左子树部分,EDGF属于此树的右子树部分。根据这些应用递归,则可以建立一个二叉树。写递归函数最重要的就是寻找递归结束的条件,在写完程序会标定.

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

#define MAX_SIZE 100

typedef struct BiTNode

{

char data;

struct BiTNode *lchild,*rchild;

}BiTNode;

void MakeTree(char in_order[],int in_start,int in_end,char pre_order[],int pre_start,int pre_end,BiTNode **T)

{

int i;

if(in_start>in_end||pre_start>pre_end) //此为结束条件,需要理解的朋友需要自己根据给的先序和中序自己画图,然后推敲算法。

*T=NULL;

for(i=in_start;i<=in_end;i++)

{

if(in_order[i]==pre_order[pre_start])

{

*T=(BiTNode*)malloc(sizeof(BiTNode));

(*T)->data=in_order[i];

MakeTree(in_order,in_start,i-1,pre_order,pre_start+1,pre_start+i-in_start,&(*T)->lchild);

MakeTree(in_order,i+1,in_end,pre_order,pre_start+i-in_start+1,pre_end,&(*T)->rchild);

break;

}

if(i>in_end)

{

printf("error,input wrong data!\n");

return;

}

}

}

void postorder(BiTNode *T)

{

    if(T)

{

        postorder(T->lchild);

        postorder(T->rchild);

        printf("%c\t",T->data);

    }

}

void main()

{

    BiTNode *T=NULL;

    char in[MAX_SIZE],pre[MAX_SIZE];

    printf("请输入前序序列:\n");

gets(pre);

    printf("请输入中序序列:\n");

gets(in);

    MakeTree(in,0,strlen(in)-1,pre,0,strlen(pre)-1,&T);

    printf("\n后序遍历序列为:\n");

    postorder(T);

printf("\n");

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐