题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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) {
TreeNode root = new TreeNode(pre[0]); //根节点
int length = pre.length;
if(length==1) //叶子节点
{
root.left = null;
root.right = null;
}
int sum = 0;
while(sum<in.length)
{
if(in[sum] == pre[0])
break; //寻找中序遍历的根节点
sum++;
}
if(sum>0) //生成左子树
{
int[] pre1 = new int[sum];
int[] in1 = new int[sum];
for(int i=0;i<sum;i++)
{
pre1[i] = pre[i+1];
in1[i] = in[i];
}
root.left=reConstructBinaryTree(pre1,in1);
}
else
root.left=null;
if(length-sum-1>0) //生成右子树
{
int[] pre2 = new int[length-sum-1];
int[] in2 = new int[length-sum-1];
for(int i=sum+1;i<length;i++)
{
pre2[i-sum-1] = pre[i];
in2[i-sum-1] = in[i];
}
root.right = reConstructBinaryTree(pre2,in2);
}
else
root.right = null;
return root;
}
}
自己出现的问题:
数字使用前要先初始化。。。
要分清楚左子树和右子树数组的起点和终点。