zoukankan      html  css  js  c++  java
  • 255. Verify Preorder Sequence in Binary Search Tree

    Given an array of numbers, verify whether it is the correct preorder traversal sequence of a binary search tree.

    You may assume each number in the sequence is unique.

    Follow up:
    Could you do it using only constant space complexity?

    Hide Company Tags
     Zenefits
    Show Tags
    Show Similar Problems
     
    /* Stack time O(n)space O(n)
    public class Solution {
        public boolean verifyPreorder(int[] preorder) {
            //stack preorder root -left - right  先降序后升序
            Stack<Integer> stack = new Stack<>();
            int min = Integer.MIN_VALUE;
            for(int i = 0; i < preorder.length; i ++){
                if(preorder[i] < min)  
                    return false;
                while(!stack.isEmpty() && stack.peek() < preorder[i]){
                    min = stack.pop();
                }
                stack.push(preorder[i]);
            }
            return true;
        }
    }*/
    
    public class Solution {
        public boolean verifyPreorder(int[] preorder) {
            int i = -1;
            int min = Integer.MIN_VALUE;
            for(int num : preorder){
                if(num < min)
                    return false;
                while(i >= 0 &&  preorder[i] < num){
                    min = preorder[i--];
                }
                preorder[++i] = num;
            }
            return true;
        }
    }

    Follow up 参考 https://segmentfault.com/a/1190000003874375

    如何验证中序序列?A:中序序列是有序的,只要验证其是否升序的就行了。

    如何验证后序序列?

    后序序列的顺序是left - right - root,而先序的顺序是root - left - right。我们同样可以用本题的方法解,不过是从数组的后面向前面遍历,因为root在后面了。而且因为从后往前看是先遇到right再遇到left,所以我们要记录的是限定的最大值,而不再是最小值,栈pop的条件也变成pop所有比当前数大得数。栈的增长方向也是从高向低了。

    public static boolean verifyPostorder(int[] preorder) {
                int i = preorder.length;
                int max = Integer.MAX_VALUE;
                for(int j = preorder.length -1; j >=0; j--){
                    if(preorder[j] > max)
                        return false;
                    while(i < preorder.length &&  preorder[i] < preorder[j]){
                        max = preorder[i++];
                    }
                    preorder[--i] = preorder[j];
                }
                return true;
            }
  • 相关阅读:
    牛客网 二叉树的镜像 JAVA
    牛客网 反转链表 JAVA
    牛客网 调整数组顺序使奇数位于偶数前面 JAVA
    Integer to Roman LeetCode Java
    Valid Number leetcode java
    Longest Common Prefix
    Wildcard Matching leetcode java
    Regular Expression Matching
    Longest Palindromic Substring
    Add Binary LeetCode Java
  • 原文地址:https://www.cnblogs.com/joannacode/p/5951395.html
Copyright © 2011-2022 走看看