题目描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
用递归的方法写的这个问题,还没有考虑用非递归的做法来做,写好了再来补充,思路其实很简单前序遍历第一个肯定是根节点,然后就可以在中序遍历中查找这个结点,这样的话根节点左边的就是左子树,根节点右边的就是右子树,实现代码如下:
public class Solution5 {
/**
* @tipic
* 题目描述:
* 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序
* 遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中
* 序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
*/
public static void main(String[] args) {
int pre [] = {1,2,4,7,3,5,6,8};
int in[] = {4,7,2,1,5,3,8,6};
print(reConstructBinaryTree(pre,in));
}
public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {
return reconstruct(pre,0,pre.length-1,in,0,in.length-1);
}
//ps表示前序遍历开始下标,pe表示结束下标;is表示中序遍历开始下标,ie表示中序遍历结束下标
public static TreeNode reconstruct(int[]pre,int ps,int pe,int[] in,int is,int ie){
if(ps > pe || is > ie)return null;
TreeNode node = new TreeNode(pre[ps]);//根节点
int value = node.val;
//在中序遍历中查找根节点的位置
int index = is;
for(; index<=ie; index++){
if(in[index] == value)break;
}
//查找失败
if(index > ie)throw new RuntimeException("输入有误!");
//构造左右子树
node.left = reconstruct(pre,ps+1,ps+index-is,in,is,index-1);
node.right = reconstruct(pre,ps+index-is+1,pe,in,index+1,ie);
return node;
}
//前序遍历方法输出树
public static void print(TreeNode node){
System.out.println(node.val);
if(node.left != null)
print(node.left);
if(node.right != null)
print(node.right);
}
}
class TreeNode{
int val;
TreeNode left;
TreeNode right;
TreeNode(int value){
val = value;
}
}