根据中序遍历和后序遍历树构造二叉树
来源:互联网 发布:淘宝美工ps教程 编辑:程序博客网 时间:2024/04/30 12:05
一、题目描述
根据中序遍历和后序遍历树构造二叉树
注意事项:可以假设树中不存在相同数值的节点
样例
给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2]
返回如下的树:
2 / \1 3
二、解题思路
思路和用前序遍历和后序遍历树构造二叉树类似
1、首先根据后序遍历序列的最后一个数字创建根结点(后序遍历序列的最后一个数字就是根结点)
2、然后在中序遍历序列中找到根结点所在的位置,这样就能确定左、右子树结点的数量,这样也就分别找到了左、右子树的中序遍历序列和后序遍历序列。
3、然后用递归的方法去构建左、右子树,直到叶子结点。
三、代码实现
/** * Definition of TreeNode: * public class TreeNode { * public int val; * public TreeNode left, right; * public TreeNode(int val) { * this.val = val; * this.left = this.right = null; * } * } */public class Solution { /** *@param inorder : A list of integers that inorder traversal of a tree *@param postorder : A list of integers that postorder traversal of a tree *@return : Root of a tree */ //在中序遍历序列中找到根结点的位置 private int findPosition(int[] array, int start, int end, int key) { for (int i = start; i <= end; i++) { if (array[i] == key) { return i; } } return -1; } //重建二叉树,通过递归调用来一步步的重建 private TreeNode myBuildTree(int[] inorder, int inStart, int inEnd, int[] postorder, int postStart, int postEnd) { if (inStart > inEnd) { return null; } //根据后序遍历序列的最后一个数字建立根结点root TreeNode root = new TreeNode(postorder[postEnd]); //获取根结点的位置position int position = findPosition(inorder, inStart, inEnd, postorder[postEnd]); //创建左子树 root.left = myBuildTree(inorder, inStart, position - 1, postorder, postStart, postStart + (position - inStart- 1)); //创建右子树 root.right = myBuildTree(inorder, position + 1, inEnd, postorder, postStart + (position - inStart), postEnd - 1); return root; //返回根结点 } public TreeNode buildTree(int[] inorder, int[] postorder) { // write your code here if (inorder.length != postorder.length) { return null; } return myBuildTree(inorder, 0, inorder.length - 1, postorder, 0, postorder.length - 1); }}
四、注意事项
在序列中划分左、右子树时,确定数组下标一定要仔细,否则很容易出现数组越界异常,且得不到正确的二叉树。
0 0
- 根据中序遍历和后序遍历树构造二叉树
- 树—根据中序遍历和后序遍历(或者前序和中序)构造二叉树
- 根据前序和中序遍历构造二叉树
- 根据前序和中序遍历构造二叉树
- 根据中序和层次遍历序列,构造二叉树
- 根据树的前序遍历和中序遍历构造树,输出后序遍历
- 旧话重提,根据先序和中序遍历构造二叉树并后序遍历验证之
- 根据中序遍历和后序遍历求二叉树的先序遍历
- 根据中序遍历和先序遍历,后序遍历创建二叉树。
- 数组实现根据二叉树的先序遍历和中序遍历构造二叉树
- 根据二叉树的前序遍历和中序遍历构造二叉树
- 根据后序和中序遍历重建二叉树
- 二叉树 根据前序遍历和中序遍历 或者 后序遍历和中序遍历建树
- 根据前序遍历和中序遍历,后序遍历和中序遍历重构二叉树
- 根据前序遍历和中序遍历树构造二叉树
- 根据前序遍历和中序遍历树构造二叉树
- 根据前序遍历序列和中序遍历序列构造二叉树
- 根据前序遍历和中序遍历结果构造二叉树
- 2014年第五届蓝桥杯预赛题目JAVA软件开发高职高专组核桃的数量
- LeetCode 166. Fraction to Recurring Decimal
- 9.3.1
- 为frameworkbaseservice下的服务添加permission
- css中的定位问题
- 根据中序遍历和后序遍历树构造二叉树
- 计算24点程序代码
- C语言实验——打印数字图形 (sdut oj)
- Netflix Eureka 深层解析(下)
- 合计函数和表约束实现
- 【转】Netflix、亚马逊、爱奇艺,三大视频巨头技术之路
- 谈谈持续集成,持续交付,持续部署之间的区别
- 浏览器渲染机制
- Least Common Multiple HDU - 1019