您的位置:首页 > Web前端

剑指offer----重建二叉树---java实现

2016-07-04 17:29 459 查看
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

思路:根据先序遍历数组,可以得到树的根节点,根据得到的根节点,去中序数组中找到相应的根节点,因为中序的遍历顺序是左--根--右,可以得到根节点的左子树和右子树的中序遍历数组,这样树的左子树中节点的个数和右子树上节点的个数就确定了。在先序数组中,左子树的先序和左子树的先序也可以确定了。

参数:先序遍历数组,子树在先序数组中的开始位置,结束位置。

         中序遍历数组,子树在中序数组中的开始位置,结束位置。

可以根据先序和中序数组得到子树的先序和中序数组,所以此问题可以用递归解决。

代码:

/*class TreeNode
{
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
*/
public class BulidTree
{

public TreeNode reConstructBinaryTree(int [] pre,int [] in)
{
if(pre == null || in == null || pre.length != in.length )//如果先序或者中序数组有一个为空的话,就无法建树,返回为空
return null;
else
{
return reBulidTree(pre,0,pre.length-1,in,0,in.length-1);
}
}
private TreeNode reBulidTree(int[] pre,int startPre,int endPre,int[] in,int startIn,int endIn)
{
if(startPre > endPre || startIn > endIn)//先对传的参数进行检查判断
return null;
int root = pre[startPre];//数组的开始位置的元素是跟元素
int locateRoot = locate(root,in,startIn,endIn);//得到根节点在中序数组中的位置 左子树的中序和右子树的中序以根节点位置为界
if(locateRoot == -1) //在中序数组中没有找到跟节点,则返回空
return null;
TreeNode treeRoot = new TreeNode(root);//创建树根节点
treeRoot.left = reBulidTree(pre,startPre + 1,startPre + locateRoot - startIn,in,startIn,locateRoot-1);//递归构建左子树
treeRoot.right = reBulidTree(pre,startPre+locateRoot-startIn+1,endPre,in,locateRoot+1,endIn);//递归构建右子树
return treeRoot;
}
//找到根节点在中序数组中的位置,根节点之前的是左子树的中序数组,根节点之后的是右子树的中序数组
private int locate(int root,int[] in,int startIn,int endIn)
{
for (int i = startIn; i < endIn; i++)
{
if(root == in[i])
return i;
}
return -1;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息