剑指offer-7 重建二叉树
微信搜索【程序员画工师】关注更多Java编程技术、数据结构与算法、面试题相关内容。
题目
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
思路
在二叉树的前序遍历序列中,第一个节点就是树的根节点,在中序遍历中,根节点在序列的中间。所以我们先根据前序遍历序列的第一个数字创建根结点,接下来在中序遍历序列中找到根结点的位置,根节点的左边就是左子树,右边就是右子树,这样就分别找到了左右子树对应的子序列。既然分别找到了左、右子树的前序遍历序列和中序遍历序列,那就可以用同样的方法分别构建左、右子树。也就是说,接下来可以用递归的方法完成。
上代码
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
int preStart = 0;
int inStart = 0;
int preEnd = pre.length-1;
int inEnd = in.length-1;
return newBinaryTree(pre, in, preStart, preEnd,inStart,inEnd);
}
public TreeNode newBinaryTree(int[] pre,int[] in,int preStart,int preEnd,int inStart,int inEnd){
if(preStart>preEnd || inStart>inEnd){
return null;
}
TreeNode treeNode=new TreeNode(pre[preStart]);
for(int i = 0;i<=preEnd;i++){
if(in[i] == pre[preStart]){ //在中序遍历的结果中找到根节点的位置
//分别新建根节点的左子树和右子树
treeNode.left = newBinaryTree(pre,in,preStart+1,preStart+i-inStart,inStart,i-1);
treeNode.right = newBinaryTree(pre,in,preStart+i-inStart+1,preEnd,i+1,inEnd);
}
}
return treeNode;
}
}
References
[1] 《剑指offer(第二版)》 何海涛著
[2] https://blog.youkuaiyun.com/gaoyueace/article/details/88692734
程序员画工师公众号,欢迎交流