ural 1136. Parliament (通过后序遍历构建二叉搜索树)
2013-07-22 12:05
211 查看
对于一个后序遍历序列,它可以分解为 (左子树部分)(右子树部分)(根),由于是查找树,可知(左子树)<(根) (右子树)>(根)
所以对于当前一个区间内的序列[l,r],可以知道r下标对应的数值一定是当前子树的根,然后找到一个下标k, [l,k-1] 里面的数值都小于根,他们是左子树 , [k,r-1]里面的数值都大于根,他们是右子树,这样就可以递归建树下去了。建树之后直接用新的规则后序遍历二叉树即可
所以对于当前一个区间内的序列[l,r],可以知道r下标对应的数值一定是当前子树的根,然后找到一个下标k, [l,k-1] 里面的数值都小于根,他们是左子树 , [k,r-1]里面的数值都大于根,他们是右子树,这样就可以递归建树下去了。建树之后直接用新的规则后序遍历二叉树即可
#include <cstdio> #include <cstring> #define N 3010 int a ,tot; struct node { int n; int lch,rch; }t ; int n; int build(int l ,int r) { if(l > r) return -1; int i,pos; t[tot].n = a[r]; //保存树根 pos = tot++; if(l == r) return pos; for(i=l; i<r; i++) if(a[i] > a[r]) break; //左子树区间[l,i-1] , 右子树区间[i,r-1] int lch = build(l,i-1); int rch = build(i,r-1); t[pos].lch = lch; t[pos].rch = rch; return pos; } void Travel(int rt) { if(rt == -1) return ; Travel(t[rt].rch); Travel(t[rt].lch); if(rt == 0) printf("%d\n",t[rt].n); else printf("%d ",t[rt].n); } int main() { while(scanf("%d",&n)!=EOF) { memset(t,-1,sizeof(t)); for(int i=0; i<n; i++) scanf("%d",&a[i]); tot=0; build(0,n-1); //递归建树 Travel(0); } return 0; }
相关文章推荐
- 剑指offer第二十三题【二叉搜索树的后序遍历序列】c++实现
- 剑指offer_二叉搜索树的后序遍历序列
- 24 二叉搜索树的后序遍历序列
- 剑指offer-二叉搜索树的后序遍历序列
- 判断某数组是不是二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列
- 软件设计艺术大师基础--判断序列是否为二叉搜索树的后序遍历序列
- 剑指offer--二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列(判断后序遍历序列是否合法)
- 【剑指Offer面试编程题】题目1367:二叉搜索树的后序遍历序列--九度OJ
- 通过中序遍历、后序遍历求先序遍历
- LeetCode-106:Construct Binary Tree from Inorder and Postorder Traversal (利用中序和后序遍历构建二叉树) -- medium
- 二叉搜索树的后序遍历序列
- PAT树_层序遍历叶节点、中序建树后序输出、AVL树的根、二叉树路径存在性判定、奇妙的完全二叉搜索树、最小堆路径、文件路由
- 面试题24:二叉搜索树的后序遍历序列
- 二叉搜索树后序线索化+后序遍历C语言
- 剑指offer——二叉搜索树的后序遍历序列
- [LeetCode]106 根据中序遍历和后序遍历构建二叉树
- 剑指offer:二叉搜索树的后序遍历序列
- 二叉搜索树的后序遍历序列