《剑指Offer》-004 -Java版二叉树先序和中序遍历返回原二叉树

如题 (总结要点)

    1. 注意空值
    1. 假定数据是没有问题的
    1. 前序(根左右) ,中序(左根右), 故每次的第一个节点就是根节点

借鉴学习文章列表

  • 链接1:
  • 链接2:
  • ALiBaBaJavaCodingGuideLines有话说 :

1.题目

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

2. Solution代码

/**
 * FileName: ${FILENAME}
 * 类的详细说明 : 1. 注意空值
 *                2. 假定数据是没有问题的
 *                3.前序(根左右) ,中序(左根右), 故每次的第一个节点就是根节点
 * @author SongZeShan
 * @version 1.0
 * @Date 2019/7/11 18:10
 */
public class Solution {
    /**重建出该二叉树*/
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if(pre.length==0||in.length==0||pre.length!=in.length){
            return null;
        }
        //建树,根节点赋值
        TreeNode treeNode = new TreeNode(pre[0]);
        int index = indexOf(in,pre[0]);
        //左子树长度为index-1
        treeNode.left = reConstructBinaryTree(copyRange(pre, 1, index), copyRange(in, 0, index-1));
        //右子树为长度为in.length-index
        treeNode.right = reConstructBinaryTree(copyRange(pre, index+1, pre.length-1), copyRange(in, index+1, pre.length-1));

        return treeNode;
    }
    /**复制下标*/
    private int[] copyRange(int arr[],int beg,int end){
        int []newArr = new int[end-beg+1];
        for(int i=beg;i<=end;i++){
            newArr[i-beg]=arr[i];
        }
        return newArr;
    }
    /**查找key值,返回索引index*/
    private int indexOf(int []arr,int key){
        for(int i=0;i<arr.length;i++){
            if(key==arr[i]){
                return i;
            }
        }
        return -1;
    }
}

3.TreeNode 二叉树代码

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

4.测试

/**
 * FileName: ${FILENAME}
 * 类的详细说明
 *
 * @author SongZeShan
 * @version 1.0
 * @Date 2019/7/11 18:10
 */
public class Test {
    public static void main(String[] args) {
        Solution solution = new Solution();
        int pre[] = {1,2,4,7,3,5,6,8};
        int in[] = {4,7,2,1,5,3,8,6};

        TreeNode treeNode = solution.reConstructBinaryTree(pre,in );

        //输出测试
        preOrder(treeNode);
        System.out.println();
        midOrder(treeNode);
    }
    /**遍历一次二叉树先序输出*/
    private static void preOrder(TreeNode node){
        if(node==null){
            return ;
        }
        System.out.print(node.val+"	");
        preOrder(node.left);
        preOrder(node.right);
    }
    /**遍历一次二叉树中序输出*/
    private static void midOrder(TreeNode node){
        if(node==null){
            return ;
        }
        midOrder(node.left);
        System.out.print(node.val+"	");
        midOrder(node.right);
    }
}

测试结果 ,和原答案一模一样

1	2	4	7	3	5	6	8	
4	7	2	1	5	3	8	6	
Process finished with exit code 0

原文地址:https://www.cnblogs.com/zhazhaacmer/p/11176912.html