您的位置:首页 > Web前端

《剑指Offer》 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。

2017-09-29 10:48 447 查看


题目描述

输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
个人分析:
1 通过前序遍历拿到二叉树的根节点
 2 找到根节点在中序遍历中的位置,确定二叉树的左右子树节点
3  通过遍历确定左右各子树的前序遍历和中序遍历
4  递归  重复上述步骤
public class Demo {
public static TreeNode reConstructBinaryTree(int [] pre,int [] in) {

// 递归出口
if(pre.length == 0 || in.length == 0 || pre.length != in.length) {
return null;
}
// 拿到根结点
TreeNode root = new TreeNode(pre[0]);

// 找的根结点在中序遍历中的位置
int i = 0;
while(in[i] != root.val) {
i++;
}
//确定左子树前序遍历长度
int[] preLeft = new int[i];
//确定左子树中序遍历长度
int[] inLeft = new int[i];

//确定右子树前序遍历长度
int[] preRight = new int[in.length - i -1];
//确定右子树中序遍历长度
int[] inRight = new int[in.length - i -1];

// 遍历 依次拿到左右子树  前中序遍历的值
for(int j = 0 ; j<in.length ;j++) {
if(j < i) {
preLeft[j] = pre[j+1];
inLeft[j] = in[j];
}else if(j > i) {
preRight[j-i-1] = pre[j];
inRight[j-i-1] = in[j];
}
}
// 递归
root.left = reConstructBinaryTree(preLeft,inLeft);
root.right = reConstructBinaryTree(preRight,inRight);
return root;
}
//后序遍历
public static void last(TreeNode tr) {
if(tr == null) {
return ;
}

last(tr.left);
last(tr.right);
System.out.print(tr.val +" ");
}

public static void main(String[] args) {
int[] a = {1,2,4,7,3,5,6,8};
int[] b = {4,7,2,1,5,3,8,6};
TreeNode root = reConstructBinaryTree(a,b);
last(root);
}
}

class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐