算法题17 重建二叉树
2016-03-14 16:37
267 查看
题目
已知一个二叉树的前序和中序遍历数组,构建这个二叉树。如已知前序为:abcdf,中序为:cbdaf,可以构建出这个二叉树为 a
/ \
b f
/ \
c d
分析
已知前序和中序排列或者已知后序和中序排列,思路都是通过前序或者后序确定树或子树的根节点,通过中序找到根节点所在的位置;
中序的根节点左边的是左子树的元素(也是中序),右边是右子树的元素;确定好左右子树元素序列长度后依次递归构建左子树和右子树。
代码
对于什么已知前序和后序不能确定唯一的一个二叉树,可以通过举例证明:如二叉树 a 和 a 的前序遍历都是abc,后序遍历都是cba。由此我们可以知道,如果二叉树中有一个子树结构是这种非满的结构,将不能确定子叶节点在左边还是在右边
/ \
b b
/ \
c c
已知一个二叉树的前序和中序遍历数组,构建这个二叉树。如已知前序为:abcdf,中序为:cbdaf,可以构建出这个二叉树为 a
/ \
b f
/ \
c d
分析
已知前序和中序排列或者已知后序和中序排列,思路都是通过前序或者后序确定树或子树的根节点,通过中序找到根节点所在的位置;
中序的根节点左边的是左子树的元素(也是中序),右边是右子树的元素;确定好左右子树元素序列长度后依次递归构建左子树和右子树。
代码
1 //已知前序和中序排列,构建二叉树 2 TreeNode* ConstructCore(char* start_porder,char* end_porder,char* start_morder,char* end_morder) 3 { 4 TreeNode* node=new TreeNode(); 5 node->value=*start_porder; 6 node->pLeft=NULL; 7 node->pRight=NULL; 8 9 if (start_morder==end_morder) 10 { 11 return node; 12 } 13 14 //find the position of the first value of preorder array in the middle order array. 15 char* p=start_morder; 16 while(start_morder<=end_morder&&*p!=node->value) 17 { 18 p++; 19 } 20 21 if (p==end_morder&&*p!=node->value) 22 throw std::exception("Invalid input."); 23 24 int left_len=p-start_morder; 25 26 if (left_len>0) 27 { 28 node->pLeft=ConstructCore(start_porder+1,start_porder+left_len,start_morder,p-1); 29 } 30 if ((end_porder-start_porder)>left_len) 31 { 32 node->pRight=ConstructCore(start_porder+left_len+1,end_porder,p+1,end_morder); 33 } 34 35 return node; 36 37 } 38 39 TreeNode* ConstructTree(char* arry_porder,char* arry_morder,int len) 40 { 41 TreeNode* root=new TreeNode(); 42 43 return ConstructCore(arry_porder,arry_porder+len-1,arry_morder,arry_morder+len-1); 44 }
1 //已知后序和中序排列,构建二叉树 2 TreeNode* ConstructCore2(char* start_post,char* end_post,char* start_morder,char* end_morder) 3 { 4 TreeNode* node=new TreeNode(); 5 node->value=*end_post; 6 node->pLeft=NULL; 7 node->pRight=NULL; 8 9 if (start_morder==end_morder) 10 { 11 return node; 12 } 13 14 //find the position of the last value of post order array in the middle order array. 15 char* p=start_morder; 16 while(start_morder<=end_morder&&*p!=node->value) 17 { 18 p++; 19 } 20 21 if (p==end_morder&&*p!=node->value) 22 throw std::exception("Invalid input."); 23 24 int left_len=p-start_morder; 25 26 if (left_len>0) 27 { 28 node->pLeft=ConstructCore(start_post,start_post+left_len-1,start_morder,p-1); 29 } 30 if ((end_post-start_post)>left_len) 31 { 32 node->pRight=ConstructCore(start_post+left_len,end_post-1,p+1,end_morder); 33 } 34 35 return node; 36 37 } 38 39 TreeNode* ConstructTree(char* arry_porder,char* arry_morder,int len) 40 { 41 TreeNode* root=new TreeNode(); 42 43 return ConstructCore2(arry_porder,arry_porder+len-1,arry_morder,arry_morder+len-1); 44 }
对于什么已知前序和后序不能确定唯一的一个二叉树,可以通过举例证明:如二叉树 a 和 a 的前序遍历都是abc,后序遍历都是cba。由此我们可以知道,如果二叉树中有一个子树结构是这种非满的结构,将不能确定子叶节点在左边还是在右边
/ \
b b
/ \
c c
相关文章推荐
- 算法题18 二叉树的前序、中序、后序、分层遍历
- 算法题19 把数组排成最小的数
- 算法题20 数值的整数次方
- 算法题21 打印1到最大的n位数
- 算法题22 树的镜像
- 算法题23 带min函数的栈
- 算法题24 二叉树的中序遍历之二叉搜索树转排序双向链表
- 算法题25 二叉树的后序遍历变形之二叉树中和为某一值的路径
- 将博客搬至CSDN
- MySql连接——内连接、外连接(左连接、右连接、全连接)
- 游戏中的 2D 可见性
- lintcode-medium-Best Time to Buy and Sell Stock II
- InitGoogleLogging坑爹
- C# zip压缩
- 数据仓库专题20-案例篇:电商领域数据主题域模型设计v0.1(改进意见征集中)
- HAproxy指南之haproxy配置详解1(理论篇)
- 内核启动错误:use vmalloc=<size> to increase size.
- 309.Best Time to Buy and Sell Stock with Cooldown
- Android设计模式系列(2)--SDK源码之观察者模式
- 浅谈MVP