1.题目
给定节点数为 n 的二叉树的前序遍历和中序遍历结果,请重建出该二叉树并返回它的头结点。
例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}
2.解法
树形的问题一般使用递归解决,将递归出口定义好,剩下的就是调用了。
中序遍历的特点是
左子树 + 根 + 右子树
前序遍历的特点是:
根 +左子树 + 右子树
于是可以采取递归:从前序表中第一个元素就是根,然后到中序表去到根,那么左侧是左子树、右侧是右子树。问题得解
public class Solution {
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public TreeNode reConstructBinaryTree(int[] pre, int[] vin) {
if(pre==null||pre.length==0) return null;
int rootval = pre[0];
//查出中序遍历根节点的位置
int pos = -1;
for(int i=0;i<vin.length;i++) {
if(vin[i]==rootval) {
pos = i;
break;
}
}
int left_len = pos;
int right_len = pre.length-1-pos;
int[] pre_left = new int[left_len];
int[] pre_right = new int[right_len];
int[] vin_left = new int[left_len];
int[] vin_right = new int[right_len];
System.arraycopy(pre,1,pre_left,0,left_len);
System.arraycopy(pre,1+left_len,pre_right,0,right_len);
System.arraycopy(vin,0,vin_left,0,left_len);
System.arraycopy(vin,1+left_len,vin_right,0,right_len);
TreeNode node = new TreeNode(rootval);
node.left = reConstructBinaryTree(pre_left,vin_left);
node.right = reConstructBinaryTree(pre_right,vin_right);
return node;
}
public static void main(String[] args) {
TreeNode node = new Solution().reConstructBinaryTree(new int[]{1,2,4,7,3,5,6,8}, new int[]{4,7,2,1,5,3,8,6});
}
}
总结
使用递归 需要理解树的前序和中序遍历的特点。
算法系列在github上有一个开源项目,主要是本系列博客的demo代码。https://github.com/forestnlp/alg
如果您对软件开发、机器学习、深度学习有兴趣请关注本博客,将持续推出Java、软件架构、深度学习相关专栏。
您的支持是对我最大的鼓励。