zoukankan      html  css  js  c++  java
  • 《剑指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
    
    
  • 相关阅读:
    货币
    沙漏
    秋季学习总结
    三个老师
    介绍自己
    redis 的部分配置
    第二次博客作业
    第一次阅读作业
    shell_通配符
    shell_/dev/null,>和&
  • 原文地址:https://www.cnblogs.com/zhazhaacmer/p/11176912.html
Copyright © 2011-2022 走看看