输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
//这是牛客网剑指Offer第四题,刚开始做只有部分思路,根据提高的条件知道要循环两个数组递归调用来实现二叉树的
//创建,但是具体怎么做,则没有头绪,所以参考了别人的方法,遗憾的是方法中注释太少,看了一会儿才理解,所以我
//又多添加了注释
//同时,添加了一个二叉树的前序遍历方法,用于对创建的二叉树进行验证
public class Solution {
public static void main(String[] args) {
int[] pre = {1, 2, 4, 6, 3, 5, 7, 8};//pre数组用来保存二叉树的先序遍历序列
int[] in = {2, 6, 4, 1, 7, 5, 8, 3};//in数组用来保存二叉树的中序遍历序列
TreeNode t = reConstructBinaryTree(pre, in);//根据二叉树的前序和中序遍历序列重建二叉树
preOrderTraverse(t);//前序遍历二叉树并打印
}
//前序遍历二叉树,使用递归
private static void preOrderTraverse(TreeNode t) {
if (t != null) {
System.out.println(t.val);
preOrderTraverse(t.left);
preOrderTraverse(t.right);
}
}
/*
* 思路:使用递归方法来根据二叉树的前序和中序遍历序列重建二叉树,
* 1.判断数组中的元素个数,如果只有一个,则直接返回
* 2.如果数组中的元素个数大于1,则进行后续操作
* 3.前序pre数组的第一个元素即为二叉树的根节点
* 4.把二叉树的前序pre数组中的根节点后面的部分元素赋值给新创建的前序prel数组
* 把二叉树的中序in数组中的根节点前面的元素赋值给新创建的中序inl数组
* 5.然后二叉树的左子树调用reConstructBinaryTree(prel, inl)方法
* 6.二叉树的右子树过程与左子树相同
* */
//根据二叉树的前序和中序遍历序列重建二叉树,使用递归
public static TreeNode reConstructBinaryTree(int[] pre, int[] in) {
TreeNode treeNode = new TreeNode(pre[0]);//创建一个二叉树结点,并给其val域赋值
//如果数组中只有一个结点,直接返回该二叉树
if (pre.length == 1) {
treeNode.left = null;
treeNode.right = null;
return treeNode;
}
//此处不能把i定义再for循环里面,因为后面还要用
int i;
//遍历中序数组,获得根节点在中序数组中的位置
for (i = 0; i < in.length; i++) {
if (treeNode.val == in[i]) {
break;
}
}
//左子树实现
if (i > 0) {
//创建数组用来保存二叉树左子树的元素,数组的大小和i的值相同
int[] prel = new int[i];
int[] inl = new int[i];
for (int j = 0; j < i; j++) {
prel[j] = pre[j + 1];//把二叉树的前序pre数组中的根节点后面的左子树的元素赋值给新创建的前序prel数组
inl[j] = in[j];//把二叉树的中序in数组中的根节点前面的元素赋值给新创建的中序inl数组
}
treeNode.left = reConstructBinaryTree(prel, inl);//左子树的递归实现
} else {
treeNode.left = null;
}
//右子树实现,实现方式与左子树类同
if (pre.length - i - 1 > 0) {
int[] prer = new int[pre.length - i - 1];
int[] inr = new int[pre.length - i - 1];
for (int j = i + 1; j < pre.length; j++) {
inr[j - i - 1] = in[j];
prer[j - i - 1] = pre[j];
}
treeNode.right = reConstructBinaryTree(prer, inr);
} else {
treeNode.right = null;
}
return treeNode;
}
}
/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
下面链接即为参考博客
参考
前序:abdfcegh
1,2,4,6,3,5,7,8
中序:bfdagehc
2,6,4,1,7,5,8,3
a | b | c | d | e | f | g | h |
---|---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |