• 【LeetCode105】Construct Binary Tree from Preorder and Inorder Traversal★★


    1.题目

    2.思路

     

    3.java代码

    //测试
    public class BuildTreeUsingInorderAndPreorder {
         public static void main(String[] args) {
                int[] preSort={1,2,4,7,3,5,6,8};
                int[] inSort={4,7,2,1,5,3,8,6};
                System.out.println(new Solution().buildTree(preSort, inSort));
            }
    }
    //利用前序和中序重建二叉树
    class Solution {
        public TreeNode buildTree(int[] preorder, int[] inorder) {
            //参数校验
            if(preorder==null||inorder==null||preorder.length!=inorder.length||preorder.length==0) 
                return null;
            return buildTreeCore(preorder,0,preorder.length-1,inorder,0,inorder.length-1);
        }
        /**
         * 构建二叉树,数据输入的正确性由输入数据自己保证
         *
         * @param preorder                    先序遍历的结果
         * @param startPreorder  先序遍历的开始位置
         * @param endPreorder    先序遍历的结束位置
         * @param inorder        中序遍历的结果
         * @param startInorder   中序遍历的开始位置
         * @param endInorder     中序遍历的结束位置
         * @return 二叉树的根结点
         */
        private TreeNode buildTreeCore(int[] preorder, int startPreorder, int endPreorder, 
            int[] inorder,int startInorder, int endInorder) {
            // 只有一个元素时直接返回该节点,这也是递归结束的出口标志
            if(startPreorder==endPreorder){
                return new TreeNode(preorder[startPreorder]);
            }else{
                // 记录根结点的在中序遍历中的位置
                int rootIn=startInorder;
                for(int i=startInorder;i<=endInorder;i++){
                    if(inorder[i]==preorder[startPreorder]){
                        rootIn=i;
                        break;
                    }
                }
                // 创建根结点
                TreeNode root=new TreeNode(inorder[rootIn]);
                 // 左子树的结点个数
                int leftLength=rootIn-startInorder;
                if(leftLength>0){
                    // startPreorder+1, startPreorder+leftLength:左子树在前序序列中的起始和结束位置
                    root.left=buildTreeCore(preorder, startPreorder+1, startPreorder+leftLength, inorder, startInorder, rootIn-1);
                }
                // 右子树的结点个数
                int rightLength=endInorder-rootIn;
                if(rightLength>0){
                    // startPreorder+leftLength+1, endPreorder:左子树在前序序列中的起始和结束位置
                    root.right=buildTreeCore(preorder, startPreorder+leftLength+1, endPreorder, inorder, rootIn+1, endInorder);
                }
                return root;
            }
        }
    }
    //二叉树节点定义
    class TreeNode {
         int val;
         TreeNode left;
         TreeNode right;
         TreeNode(int x) { val = x; }
    }
  • 相关阅读:
    数学建模(一)层次分析法
    数学建模(二)优劣解距离法Topsis模型部分
    python语法学习第十一天--模块
    机器学习——交叉验证,GridSearchCV,岭回归
    机器学习——logistic回归,鸢尾花数据集预测,数据可视化
    机器学习入门——线性回归预测广告投入数据集
    凸优化,对偶问题与拉格朗日函数
    机器学习中的凸优化,凸集,凸函数的相关定义和理论
    调整数组顺序使奇数位于偶数前面
    leetcode| 329. 矩阵中的最长递增路径
  • 原文地址:https://www.cnblogs.com/zhangboy/p/6558510.html
Copyright © 2020-2023  润新知