关闭

二叉树已知先序序列(后序序列)、中序序列求解后序序列(先序序列)

标签: 杭电遍历序列转换二叉树
310人阅读 评论(0) 收藏 举报
分类:

杭电原题:http://acm.hdu.edu.cn/showproblem.php?pid=1710

先根据先序中序序列建一个二叉树,然后后序遍历二叉树

#include <stdio.h>

#include <stdlib.h>
#include <string.h>
typedef struct node
{
int value;
struct node *pLeft;
struct node *pRight;
}Tree,*pTree;
int pre[1002];
int in[1002];
int post[1002];
int k;
void PostOrderTraverse(pTree pRoot)
{
if(pRoot->pLeft!=NULL)
PostOrderTraverse(pRoot->pLeft);
if(pRoot->pRight!=NULL)
PostOrderTraverse(pRoot->pRight);
post[k++]=pRoot->value;

}

//pre_start 先序序列第一个元素下标

//pre_end 先序序列最后一个元素下标

//in_start 中序序列第一个元素下标

//in_end 中序序列最后一个元素下标

void PreInCreateTree(pTree &pRoot,int pre_start,int pre_end,int in_start,int in_end)
{
pRoot=(pTree)malloc(sizeof(Tree));
pRoot->value=pre[pre_start];
int rootIndex;//根节点在中序序列中的下标
int i;
for(i=in_start;i<=in_end;i++)
{
if(pRoot->value==in[i])
{
rootIndex=i;
break;
}
}
if(rootIndex!=in_start)
{
PreInCreateTree(pRoot->pLeft,pre_start+1,pre_start+(rootIndex-in_start),in_start,rootIndex-1);
}
else
{
pRoot->pLeft=NULL;
}
if(rootIndex!=in_end)
{
PreInCreateTree(pRoot->pRight,pre_start+(rootIndex-in_start)+1,pre_end,rootIndex+1,in_end);
}
else
{
pRoot->pRight=NULL;
}
}
int main()
{
int i,n;
while(~scanf("%d",&n))
{
memset(pre,0,sizeof(pre));
memset(in,0,sizeof(in));
memset(post,0,sizeof(post));
for(i=0;i<n;i++)
scanf("%d",&pre[i]);
for(i=0;i<n;i++)
scanf("%d",&in[i]);
pTree pRoot;
PreInCreateTree(pRoot,0,n-1,0,n-1);
k=0;
PostOrderTraverse(pRoot);
for(i=0;i<k-1;i++)
printf("%d ",post[i]);
printf("%d\n",post[i]);
}
return 0;

}

另附由后序序列、中序序列求解先序序列的代码

相应的修改一些代码即可实现

void InPostCreateTree(pTree &pRoot,int in_start,int in_end,int post_start,int post_end)
{
pRoot=(pTree)malloc(sizeof(Tree));
pRoot->value=post[post_end];
int rootIndex;
int i;
for(i=in_start;i<=in_end;i++)
{
if(pRoot->value==in[i])
{
rootIndex=i;
break;
}
}
if(rootIndex!=in_start)
{
InPostCreateTree(pRoot->pLeft,in_start,rootIndex-1,post_start,post_start+(rootIndex-in_start)-1);
}
else
pRoot->pLeft=NULL;
if(rootIndex!=in_end)
{
InPostCreateTree(pRoot->pRight,rootIndex+1,in_end,post_start+(rootIndex-in_start),post_end-1);
}
else
pRoot->pRight=NULL;
}

1
0
查看评论

由先序+后序遍历确定序列是否唯一并输出一个中序序列

由先序+后序遍历确定序列是否唯一并输出一个中序序列@(算法学习)在前面讨论过如何确定两种唯一二叉树的情况。 先序+中序 后序+中序 中序是必须要有的,因此按照这个提示原则,我们根据根在先序或后序的位置特殊性,在中序序列中找到根的位置,迅速完成了对树的切割。反向构造时,问题也很简洁,首先确认的是根结点...
  • u011240016
  • u011240016
  • 2016-11-17 01:09
  • 876

已知二叉树先序序列和中序序列,求后序序列

回答了百度知道上的一个提问,原题是这样的: 当一棵二叉树前序序列和中序序列分别为HGEDBFCA和EGBDHFAC时,其后序序列为什么?当一棵二叉树前序序列和中序序列分别为HGEDBFCA和EGBDHFAC时,其后序序列为什么?虽然我已知道答案为EBDGACFH,请求详细算法,c语言或java都可以...
  • u011215133
  • u011215133
  • 2017-06-15 11:06
  • 1342

第4章第1节练习题14 满二叉树已知先序序列求解后序序列

设有一颗满二叉树(所有节点值均不同),已知其先序序列pre,设计一个算法求其后序序列post
  • u013595419
  • u013595419
  • 2016-08-25 11:50
  • 891

根据二叉树的前序序列和中序序列得到后序序列

一个例子: 前序序列:abdgcefh 中序序列:dgbaechf 求:后序序列 分析: 根据前序序列可知,a肯定是根节点。再在中序序列中找到a,发现a左侧是dgb,右侧是echf,则dgb应该是a的左孩子,echf是a的右孩子。 接着只要递归的判断左右孩子的后序序列就可以了。比如dgb...
  • zhimajiejie
  • zhimajiejie
  • 2012-10-10 15:42
  • 3656

关于知道后序序列和中序序列确定前序序列

以下是大神的解释  摘自洛谷题解, 比较清晰 DEBAFCG EDBFGCA 首先这棵树的根是A(后序排列的最后一个),输出A; 然后在中序排列中找到A的位置,发现它左右各有三个点,分别是它的左右子树; 把中序排列左边三个点和后序排列的前三...
  • qq_32734731
  • qq_32734731
  • 2016-12-18 18:52
  • 357

从前序+中序或者后序+中序序列中恢复二叉树过程

给出前序遍历和中序遍历,如何绘制出二叉树: 如果给出遍历产生的一串字符,不容易确定各个字符在树中的具体位置,因而需要两个遍历串相结合才能画出一棵二叉树。 如,给出前序遍历ADFGHKLPQRWZ,中序遍历GFHKDLAWRQPZ。 其具体寻找过程如下: 其中矩形内表示当前节点的左右子树的元素...
  • dalong277
  • dalong277
  • 2016-04-26 11:18
  • 1637

实现由先序、中序序列构造二叉树的算法,实现由后序、中序序列构造二叉树的算法

一道上机题 思想是递归 如果不理解原理可以看这个博客 注释里的说明很详细:http://blog.csdn.net/yunzhongguwu005/article/details/9270085 在代码的注释部分有测试样例 先序和后序: #include #include #include #...
  • Frozensmile
  • Frozensmile
  • 2017-11-14 14:33
  • 269

二叉树——(先序序列+中序序列)=后序序列

已知二叉树的先序遍历序列和中序遍历序列,求后序遍历序列。   先递归构造二叉树,然后递归得到后序序列。   思路:   先序序列的第一个结点为要构造二叉树的根结点,在中序序列中查找二叉树的根结点,则中序列根结点左边为根结点的左子树的中序序列,右边为根结点的右...
  • niushuai666
  • niushuai666
  • 2011-05-11 21:21
  • 5651

前序 中序 后序遍历 转换

题目1.若已知一棵二叉树的前序序列是BEFCGDH,中序序列是FEBGCHD,则后序序列是? 分析:前序:MLR BEFCGDH 中序:LMR FEBGCHD BEF 和CGDH的相对位置没换 EF 和 FE 相对位置换了, 所以 EF 是 ML BEF ...
  • power0405hf
  • power0405hf
  • 2016-08-25 08:17
  • 324

根据先中序序列或后中序序列确定二叉树

根据后中序序列生成二叉树:从后序序列中找到二叉树(或者子树)的根结点,然后在中序序列找到该根结点,根结点将中序序列分成左右两部分,左边为左子树,右边为右子树。根据中序序列确定左子树的长度,确定左子树中最右下根结点在后序序列中的位置,从而可以确定左右子树在后中序序列中的范围,然后递归的生成左右子树。
  • QiaoRuoZhuo
  • QiaoRuoZhuo
  • 2014-10-03 11:36
  • 1849
    个人资料
    • 访问:40075次
    • 积分:1073
    • 等级:
    • 排名:千里之外
    • 原创:66篇
    • 转载:28篇
    • 译文:0篇
    • 评论:1条
    文章分类