成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

[Leetcode] Verify Preorder Sequence in Binary Sear

未東興 / 2249人閱讀

摘要:如果繼續(xù)降序,說明又向左走了,這樣等到下次向右走得時候也要再次更新最小值。這樣,序列無效的條件就是違反了這個最小值的限定。我們同樣可以用本題的方法解,不過是從數(shù)組的后面向前面遍歷,因為在后面了。棧的增長方向也是從高向低了。

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?

棧法 復雜度

時間 O(N) 空間 O(N)

思路

二叉搜索樹先序遍歷序列的特點是降序的部分一定是向左走的,一旦開始升序說明開始向右走了,則上一個降序的點則限定了后面的數(shù)的最小值。如果繼續(xù)降序,說明又向左走了,這樣等到下次向右走得時候也要再次更新最小值。

    10
   /  
  5    12
 / 
2   6

如這個例子,我們在10的位置是沒有最小值限定的,然后降序走到5,依然沒有最小值,降序走到2,依然沒有,然后開始升序了,遇到6,這時候之后的數(shù)字一定大于2,同時也大于5,所以最小值更新為之前遍歷過的,且比當前數(shù)稍微小一點的那個數(shù)。這里我們可以用一個棧來暫存之前的路徑,所以升序時就是將棧中元素不斷pop出來直到棧頂大于當前數(shù),而最小值就是最后一個pop出來的數(shù),最后再把該數(shù)push進去。對于降序的時候,直接向里面push就行了。這樣,序列無效的條件就是違反了這個最小值的限定。

代碼
public class Solution {
    public boolean verifyPreorder(int[] preorder) {
        Stack stk = new Stack();
        // 初始化最小值為最小整數(shù)
        int min = Integer.MIN_VALUE;
        for(int num : preorder){
            // 違反最小值限定則是無效的
            if(num < min) return false;
            // 將路徑中所有小于當前的數(shù)pop出來并更新最小值
            while(!stk.isEmpty() && num > stk.peek()){
                min = stk.pop();
            }
            // 將當前值push進去
            stk.push(num);
        }
        return true;
    }
}
指針模擬棧法 復雜度

時間 O(N) 空間 O(N)

思路
    10
   /  
  5    12
 / 
2   6

同樣是看這個例子,我們序列是[10, 5, 2, 6, 12],如果用棧的話,遍歷序列到第n個數(shù)時,棧中的情況是這樣的:

1 | 10
2 | 10 5
3 | 10 5 2
4 | 10 6
5 | 12

可見我們棧的大小是不會超過我們當前遍歷的數(shù)的位置的,所以我們大可以用該序列的之前遍歷過的部分來當做我們的棧。這里用一個i指針標記棧頂。

注意

這里棧頂指針應初始化為-1,這樣棧第一個元素加入時,i++后不會超界

代碼
public class Solution {
    public boolean verifyPreorder(int[] preorder) {
        // 用i標記棧頂
        int i = -1, min = Integer.MIN_VALUE;
        for(int num : preorder){
            if(num < min) return false;
            // 同樣的解法,但是復用了數(shù)組作為棧,每pop一次相當于i--
            while(i >= 0 && num > preorder[i]){
                min = preorder[i--];
            }
            // push相當于i++
            preorder[++i] = num;
        }
        return true;
    }
}
后續(xù) Follow Up

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

Q:如何驗證后序序列?
A:后序序列的順序是left - right - root,而先序的順序是root - left - right。我們同樣可以用本題的方法解,不過是從數(shù)組的后面向前面遍歷,因為root在后面了。而且因為從后往前看是先遇到right再遇到left,所以我們要記錄的是限定的最大值,而不再是最小值,棧pop的條件也變成pop所有比當前數(shù)大得數(shù)。棧的增長方向也是從高向低了。

    public boolean IsValidPostOrderBst(int[] nums)
    {
        int i = nums.length;
        int max = Integer.MAX_VALUE;
        for (int j = nums.length - 1; j >= 0; j--)
        {
            if (nums[j] > max) return false;
            while (i <= nums.length - 1 && nums[j] > nums[i])
                max = nums[i++];
            nums[--i] = nums[j];
        }
        return true;
    }

文章版權歸作者所有,未經(jīng)允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/64693.html

相關文章

  • leetcode331. Verify Preorder Serialization of a Bi

    摘要:如果我們從右往左看先序遍歷,就知道后兩個節(jié)點如果遇到第三個節(jié)點,則該節(jié)點就應當是這兩個節(jié)點的父節(jié)點。如果在遍歷的過程中根節(jié)點數(shù)量小于,則說明這棵樹有問題。而如果遍歷結束之后,剩下的根節(jié)點數(shù)不等于,也說明這個先序遍歷存在問題。 題目要求 One way to serialize a binary tree is to use pre-order traversal. When we en...

    weapon 評論0 收藏0
  • LeetCode 331. Verify Preorder Serialization of a B

    摘要:如果它是一個空節(jié)點,我們可以使用一個標記值記錄,例如。例如,上面的二叉樹可以被序列化為字符串,其中代表一個空節(jié)點。每個以逗號分隔的字符或為一個整數(shù)或為一個表示指針的。如果滿足前序遍歷,那么最后棧中有且僅有一個元素,且是。 Description One way to serialize a binary tree is to use pre-order traversal. When ...

    張巨偉 評論0 收藏0
  • Verify Preorder Serialization of a Binary Tree

    摘要:令,那么從累加會一直保持正,最后為。從左往右比較好理解,因為總是總到左再到右,的總是的,所以一定是保持。注意從開始,因為沒有。 Verify Preorder Serialization of a Binary Tree 題目鏈接:https://leetcode.com/problems... recursion,用個全局的index: public class Solution {...

    melody_lql 評論0 收藏0
  • leetcode449. Serialize and Deserialize BST

    摘要:題目要求將二叉搜索樹序列化和反序列化,序列化是指將樹用字符串的形式表示,反序列化是指將字符串形式的樹還原成原來的樣子。假如二叉搜索樹的節(jié)點較多,該算法將會占用大量的額外空間。 題目要求 Serialization is the process of converting a data structure or object into a sequence of bits so that...

    Honwhy 評論0 收藏0
  • [LeetCode] 109. Convert Sorted List to Binary Sear

    Problem Given a singly linked list where elements are sorted in ascending order, convert it to a height balanced BST. For this problem, a height-balanced binary tree is defined as a binary tree in whi...

    dongfangyiyu 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<