• Construct Binary Search Tree from Preorder Traversal 之 二叉树递归


    本题目过于经典,所以在这里好好记录一下。

    总共有三种解法

    1.因为二叉搜索树的特性,将preorder数组排序,得到inorder。再将inorder的元素和下标用map存储起来,再对其进行递归。

    2.利用二叉树的特性,初始化最小值,最大值,进行递归

    3.用栈结构进行迭代。

    class Solution {
        int[] preorder;
        int idx = 0;
        Map<Integer, Integer> map_inorder = new HashMap<>();
        public TreeNode bstFromPreorder(int[] preorder) {
            this.preorder = preorder;
            int[] inorder = Arrays.copyOf(preorder, preorder.length);
            Arrays.sort(inorder);
            int n = inorder.length;
            for(int i = 0; i < n; i++){
                map_inorder.put(inorder[i], i);
            }
            return helper(0, n);
        }
        public TreeNode helper(int left, int right){
            if(left == right) return null;
            int val = preorder[idx];
            TreeNode root = new TreeNode(val);
            int index = map_inorder.get(val);
            idx++;
            root.left = helper(left, index);
            root.right = helper(index+1, right);
            return root;
        }
    }
    class Solution {
        int[] preorder;
        int idx = 0;
        int n;
        public TreeNode bstFromPreorder(int[] preorder) {
            this.preorder = preorder;
            n = preorder.length; 
            return helper(Integer.MIN_VALUE, Integer.MAX_VALUE);
        }
        public TreeNode helper(int lower, int upper){
            if(idx == n) return null;
            int val = preorder[idx];
            if(val < lower || val > upper) return null;//
            idx++;
            TreeNode root = new TreeNode(val);
            root.left = helper(lower, val);
            root.right = helper(val, upper);
            return root;
        }
    }
    class Solution {
        public TreeNode bstFromPreorder(int[] preorder) {
            int n = preorder.length;
            if(n == 0) return null;
            TreeNode root = new TreeNode(preorder[0]);
            Deque<TreeNode> stack = new ArrayDeque<>();
            stack.addLast(root);
            for(int i = 1; i < n; i++){
                TreeNode node = stack.getLast();
                TreeNode child = new TreeNode(preorder[i]);
                while(!stack.isEmpty() && stack.getLast().val < child.val){
                    node = stack.removeLast();
                }
                if(node.val < child.val) node.right = child;
                else node.left = child;
                stack.addLast(child);
            }
            return root;
        }
    }
  • 相关阅读:
    xib上的控件属性为什么要使用weak
    authenticating with the app store 一直卡住--问题记录
    ios-tableview加载卡顿的解决方案
    魔链的参考文档--移动应用之deeplink唤醒app
    iOS中Category和Extension 原理详解
    剑指offer 9-10:青蛙跳台阶与Fibonacii数列
    剑指offer 8:旋转数组的最小数字
    设计模式:单例模式(singleton)
    设计模式:工厂模式
    C++智能指针解析
  • 原文地址:https://www.cnblogs.com/yawenw/p/13026511.html
Copyright © 2020-2023  润新知