Hdu Binary Tree Traversals
In a preorder traversal of the vertices of T, we visit the root r followed by visiting the vertices of T1 in preorder, then the vertices of T2 in preorder.
In an inorder traversal of the vertices of T, we visit the vertices of T1 in inorder, then the root r, followed by the vertices of T2 in inorder.
In a postorder traversal of the vertices of T, we visit the vertices of T1 in postorder, then the vertices of T2 in postorder and finally we visit r.
Now you are given the preorder sequence and inorder sequence of a certain binary tree. Try to find out its postorder sequence.

1 2 4 7 3 5 8 9 6
4 7 2 1 8 5 9 3 6
注: 已知二叉树的前序和中序遍历, 可以唯一确定二叉树的后序遍历, 但如果知道前序和后序,求中序遍历是不可能实现的.
算法:
由前序遍历的第一个元素可确定左、右子树的根节点,参照中序遍历又可进一步确定子树的左、
右子树元素。如此递归地参照两个遍历序列,最终构造出二叉树。
由前序和中序结果求后序遍历结果
树的遍历:给你一棵树的先序遍历结果和中序遍历的结果,让你求以后序遍历输出用递归。
每次把两个数组分成三个部分,父节点,左子树,右子树,把父节点放到数组里边,重复此步骤直到重建一棵新树
, 这时,数组里元素刚好是后序遍历的顺序
关键点:
中序遍历的特点是先遍历左子树,接着根节点,然后遍历右子树。这样根节点就把左右子树隔开了。而前序遍历的特点是先访问根节点,从而实现前序遍历结果提供根节点信息,中序遍历提供左右子树信息,从而实现二叉树的重建
【注明】
先序的排列里第一个元素是根,再比较中序的排列里根所在的位置,则能确定左子树,右子树元素个数numleft,numright且在先序排列里,先是一个根,再是numleft个左子树的元素排列,最后是numright个右子树的元素排列。
该过程就是从inorder数组中找到一个根,然后从preorder数组的位置来确定改点到底是左儿子还是右儿子。如此一直循环下去知道一棵完整的数建立完成。
#include <stdio.h>
#include <stdlib.h> const int MAX = 1000 + 10;
int n,in[MAX],pre[MAX];
typedef struct BITree
{
int data,index;
BITree *Left,*Right;
}BiTree,*Tree; void DFS(Tree &root,int index)
{
if(root == NULL){
root = (Tree)malloc(sizeof(BiTree));
root->data = in[index];
root->index = index;
root->Left = NULL;
root->Right = NULL;
}else
{
if(index < root->index)
DFS(root->Left,index);
else
DFS(root->Right,index);
}
} void CreateTree(Tree &root)
{
int i,j,index;
root = (Tree)malloc(sizeof(BiTree));
for(i = 1;i <= n;i++)
if(in[i] == pre[1])
{
root->data = pre[1];
root->index = i;
root->Left = NULL;
root->Right = NULL;
break;
}
index = i;
for(i = 2;i <= n;i++)
for(j = 1;j <= n;j++)
if(in[j] == pre[i])
{
if(j < index)
DFS(root->Left,j);
else
DFS(root->Right,j);
break;
}
} void PostOrder(Tree root,int x)
{
if(root == NULL) return ;
PostOrder(root->Left,x+1);
PostOrder(root->Right,x+1);
if(x == 0)
printf("%d",root->data);
else
printf("%d ",root->data);
} int main()
{
int i;
while(scanf("%d",&n)!=EOF)
{
Tree root;
for(i = 1;i <= n;i++)
scanf("%d",&pre[i]);
for(i = 1;i <= n;i++)
scanf("%d",&in[i]);
CreateTree(root);
PostOrder(root,0);
printf("\n");
}
return 0;
}
#include <iostream>
#include <cstdio>
using namespace std; const int MAX = 1000 + 10;
typedef struct BITree
{
int data;
BITree *Left,*Right;
BITree()
{
Left = NULL;
Right = NULL;
}
}*BiTree;
int pre[MAX],in[MAX]; void BuildTree(BiTree &root,int len,int pst,int ped,int inst,int ined)
{
int i,left_len = 0;
if(len<=0)return; //递归终止的条件
root = new BITree;
root->data = pre[pst];
for(i = inst;i <= ined;i++)
if(in[i] == pre[pst])
{
left_len = i - inst;
break;
}
BuildTree(root->Left,left_len,pst+1,pst+left_len,inst,i-1);
BuildTree(root->Right,len-left_len-1,pst+left_len+1,ped,i+1,ined);
} void PostTravel(BITree *root)
{
if(root)
{
PostTravel(root->Left);
PostTravel(root->Right);
printf("%d ",root->data);
}
} int main()
{
int i,n;
BiTree root;
while(scanf("%d",&n)!=EOF)
{
for(i = 1;i <= n;i++)
scanf("%d",&pre[i]);
for(i = 1;i <= n;i++)
scanf("%d",&in[i]);
BuildTree(root,n,1,n,1,n);
PostTravel(root->Left);
PostTravel(root->Right);
printf("%d\n",root->data);
}
return 0;
}
Hdu Binary Tree Traversals的更多相关文章
- HDU 1710 二叉树的遍历 Binary Tree Traversals
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU 1710 Binary Tree Traversals (二叉树遍历)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU 1710 Binary Tree Traversals(树的建立,前序中序后序)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- hdu 1710 Binary Tree Traversals 前序遍历和中序推后序
题链;http://acm.hdu.edu.cn/showproblem.php?pid=1710 Binary Tree Traversals Time Limit: 1000/1000 MS (J ...
- hdu 1701 (Binary Tree Traversals)(二叉树前序中序推后序)
Binary Tree Traversals T ...
- hdu1710(Binary Tree Traversals)(二叉树遍历)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- HDU-1701 Binary Tree Traversals
http://acm.hdu.edu.cn/showproblem.php?pid=1710 已知先序和中序遍历,求后序遍历二叉树. 思路:先递归建树的过程,后后序遍历. Binary Tree Tr ...
- HDU 1710-Binary Tree Traversals(二进制重建)
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
- Binary Tree Traversals(HDU1710)二叉树的简单应用
Binary Tree Traversals Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/O ...
随机推荐
- top k 算法
对于一个非有序的数组A[p..r],求数组中第k小的元素. 如何考虑 排序(部分排序)就不用说了..o(nlgn),当然如果在实际情况中要一直取值,当然要排序后,一次搞定,以后都是O(1) 我们这里提 ...
- centos6.4 ceph安装部署之ceph block device
1,prelight/preface ceph storage clusterceph block deviceceph filesystemceph object storage 此篇记录ceph ...
- 如何对n个数进行排序,要求时间复杂度O(n),空间复杂度O(1)
看上去似乎任何已知的算法都无法做到,如果谁做到了,那么所有的排序方法:QuickSort,ShellSort,HeapSort,BubbleSort等等等等,都可以扔掉了,还要这些算法干吗阿,呵呵.不 ...
- 支付宝“订单交易失败 ALI64” 报错的原因
移动快捷支付,往往需要集成支付宝的sdk,集成的过程相对简单,只要按照支付宝的文档,进行操作一般不会出问题. 下面主要说明一下,集成sdk后报 "订单交易失败 请稍后再试(ALI64)&qu ...
- ios模拟器安装.app
相对于xcode的run,然后再在安装到模拟器上测试,如果是个人开发的话,那还好. 要是是团队开发,那每次其他的童鞋就都需要update最新的文件下来再编译运行了. 而且,一些测试的童鞋也不会打开xc ...
- Colorbox cannot load the image added by js
As we know, Colorbox is a wonderful js plugin. I came up against a head-banged problem in v1.5.6. Wh ...
- 个人封装的一个Camera类
好久不写博客了,代码写了不少,但大多数都是拿来主义,要不是网上,要不就是自己曾经的代码拼装. 新工作是搞Android开发的,近期任务要求我封装一个Carmera类,自己也认为还是封装以后方便使用,弄 ...
- AngularJs(八) 过滤器filter创建
大纲 示例 过滤器的使用 创建过滤器 demo 这是整个示例demo 1.filter.js文件 angular.module("exampleApp", []) .constan ...
- canvas阴影
shadowOffsetx 阴影X轴的移动 shadowOffsety 阴影的y轴移动 shadowColor 阴影颜色 shadowBlur 模糊范围 <!DOCTYPE html>&l ...
- api (三)文本字符输出 (转)
在使用Win32编程时,我们常常要输出文本到窗口上,Windows所有的文本字符或者图形输出都是通过图形设备接口(GDI)进行的,Windows的三大核心组件之一的GDI32.dll封装了所有的文本和 ...