您的位置:首页 > Web前端

每天一道算法题——重建二叉树

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}

源码:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息