每天一道算法题——重建二叉树
2017-11-21 18:22
239 查看
题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
测试用例:
[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
对应输出应该为:
{1,2,5,3,4,6,7}
源码:
运行时间
219ms
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
测试用例:
[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
对应输出应该为:
{1,2,5,3,4,6,7}
源码:
public class Test1 { class TreeNode {//定义二叉树类,以表示二叉树结构。 int val; TreeNode left; TreeNode right; TreeNode(int x){val = x;}} public TreeNode reConstructBinaryTree(int [] pre,int [] in) { TreeNode root=reConstructBinaryTree(pre,0,pre.length-1,in,0,in.length-1);//调用重载的reConstructBinary方法 return root; } // 前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6} //pre[]前序遍历的数组,int[]中序遍历的数组 //startPre代表此次前序遍历到的第一个数 endPre代表此次前序遍历到的最后一个数 //startIn代表此次中序遍历到的第一个数 endIn代表此次中序遍历到的最后一个数 private TreeNode reConstructBinaryTree(int[] pre, int startPre, int endPre, int[] in, int startIn, int endIn) { if (startPre > endPre || startIn > endIn) return null;//排除输入错误的情况 TreeNode root = new TreeNode(pre[startPre]);//创建一个新的二叉树 for (int i = startIn; i <= endIn; i++) if (in[i] == pre[startPre]) {//找到根节点 root.left = reConstructBinaryTree(pre, startPre + 1, startPre + i - startIn, in, startIn, i - 1);//递归调用,建立左子树 root.right = reConstructBinaryTree(pre, i - startIn + startPre + 1, endPre, in, i + 1, endIn);//递归调用,建立右子树 } return root; } }
运行时间
219ms
相关文章推荐
- 每天一道算法题——二叉树的镜像
- 每天一个算法之根据前序中序序列重建二叉树
- 每天一道算法题(38)——二叉树的非递归遍历
- 每天一道算法题(38)——二叉树的非递归遍历
- 每天一道算法题——二叉树中和为某一值的路径
- 每天一道算法题目(17)——二叉树的子结构
- 每天一道算法题目(17)——二叉树的子结构
- 每天一道算法题(28)——计算正整数的加、减运算式
- 每天一道算法题——拼音翻译成阿拉伯数字(有Wan,Qian,Bai,Shi单位)
- 每天一道算法题11 找出两个链表的第一个公共结点
- 每天一道算法题(31)——正数减法
- 校招准备系列:每天一道算法题(13)-斐波那契数列
- 校招准备系列:每天一道算法题(14)-合并两个排序的链表
- 每天一道算法_6_I Think I Need a Houseboat
- 每天一道算法题10 找出数组中两个只出现一次的数字
- 每天一道LeetCode-----判断两个二叉树是否相同
- 每天一道算法题8 在排序数组中查找和为给定值的两个数字
- 每天一道算法题(35)——删除字符串首尾的空格
- 每天一道LeetCode-----以字符串的形式输出二叉树所有从根节点到叶子节点的路径
- 校招准备系列:每天一道算法题(7)-末尾0的个数