给定先序: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");
}
给定中序: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");
}
相关文章推荐
- Java实现——根据先序遍历和中序遍历,确定二叉树
- 已知一颗二叉树,如果先序遍历的节点顺序是:ADCEFGHB,中序遍历是,CDFEGHAB,则后序遍历的结果为
- 小白书之根据二叉树的先序遍历和中序遍历得出后序遍历
- 剑指offer给定二叉树,求中序遍历的下一个 节点,前序遍历,后序遍历扩展
- 已知先序遍历和中序遍历,求后序遍历 && 求二叉树中节点的最大距离
- 给定二叉树的先序遍历中序遍历,求后序遍历
- 七:重建二叉树(根据先序遍历(或者后序遍历)和中序遍历重建二叉树)
- 【郝斌数据结构自学笔记】66-69_森林的存储_二叉树的先序遍历_二叉树的中序遍历【中间访问根节点】_二叉树的后序遍历【最后访问根节点】
- 给出二叉树,将二叉树进行中序线索化,在根据中序线索化二叉树,找出给定节点的前序后继节点,和给出节点的后序后继节点
- 根据先序遍历和中序遍历得出二叉树。最终以后序遍历的形式输出。
- 根据二叉树的先序遍历和中序遍历建立二叉树
- [leetcode]_根据二叉树的先序遍历(后序遍历) + 中序遍历 重建二叉树
- 二叉树的实现&&递归和非递归方式前序、中序、后续遍历&&发现一个节点中序遍历的下一节点
- 二叉树相关操作(先序建立二叉树、求子节点数量,判断是否为平衡二叉树,先序遍历,中序遍历,后序遍历)
- 1935. 二叉树重建(根据先序遍历和中序遍历重建二叉树并进行广度优先遍历)
- 根据二叉树的先序遍历和中序遍历重建二叉树
- 给定二叉树的先序遍历和中序遍历,输出它的后序遍历序列
- 根据先序遍历和中序遍历生成二叉树
- 根据先序遍历和中序遍历创建二叉树
- 由先序遍历序列和中序遍历序列恢复二叉树以及统计叶子节点个数和树的深度