题目描述
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{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)
{
//判断数组是否为空以及不相等
if(pre == null || in == null || pre.length == 0 || in.length == 0 || pre.length != in.length)
{
return null;
}
//调用递归
return rebuildTree(pre, 0, pre.length - 1, in, 0, in.length - 1);
}
//重建左右子树 递归传值给i j m n时要先画图确定其在左右子树的下标
public TreeNode rebuildTree(int[] pre, int i, int j, int[] in, int m, int n)
{
int rootVal = pre[i];
//找到根节点的位置下标
int index = findroot(rootVal, in, m, n);
if(index < 0)
{
return null;
}
//确定左右结点的个数 每次都会以新的数组序列进行
int leftNodes = index - m, rightNodes = n - index;
//赋值根节点
TreeNode root = new TreeNode(rootVal);
if(leftNodes == 0)
{
root.left = null;
}
else
{
//重建左子树 i为上一次保留的值 具体看是构建左边还是右边子树
root.left = rebuildTree(pre, i + 1, i + leftNodes, in, m, m + leftNodes - 1);
}
if(rightNodes == 0)
{
root.right = null;
}
else
{
//重建右子树
root.right = rebuildTree(pre, i + leftNodes + 1, j, in, n - rightNodes + 1, n);
}
return root;
}
//每次都会调用这个函数来找到根节点下标
public int findroot(int target, int tes[], int start, int end){
for(int i = start ; i <= end ; i++)
{ if(tes[i] == target)
{
return i; //返回下标
}
}
//不存在就返回负一
return -1;
}
}