Skip to content

Files

Latest commit

28de2ff · Oct 18, 2021

History

History
137 lines (104 loc) · 3.22 KB

File metadata and controls

137 lines (104 loc) · 3.22 KB

English Version

题目描述

给定一个整数数组,你需要验证它是否是一个二叉搜索树正确的先序遍历序列。

你可以假定该序列中的数都是不相同的。

参考以下这颗二叉搜索树:

     5
    / \
   2   6
  / \
 1   3

示例 1:

输入: [5,2,6,1,3]
输出: false

示例 2:

输入: [5,2,1,3,6]
输出: true

进阶挑战:

您能否使用恒定的空间复杂度来完成此题?

解法

二叉搜索树先序遍历时,每次移向左子树时,值递减,移向右子树时,值递增。

因此,可以维护一个单调递减栈。遍历序列,若当前值大于栈顶元素,说明开始要进入右子树的遍历。只要栈顶元素比当前值小,就表示还是左子树,要移除,也就是从栈中弹出,直至栈顶元素大于当前值,或者栈为空。此过程要记录弹出栈的最后一个元素 last。

接下来继续往后遍历,之后右子树的每个节点,都要比 last 大,才能满足二叉搜索树,否则直接返回 false。

Python3

class Solution:
    def verifyPreorder(self, preorder: List[int]) -> bool:
        stk = []
        last = float('-inf')
        for x in preorder:
            if x < last:
                return False
            while stk and stk[-1] < x:
                last = stk.pop()
            stk.append(x)
        return True

Java

class Solution {
    public boolean verifyPreorder(int[] preorder) {
        Deque<Integer> stk = new ArrayDeque<>();
        int last = Integer.MIN_VALUE;
        for (int x : preorder) {
            if (x < last) {
                return false;
            }
            while (!stk.isEmpty() && stk.peek() < x) {
                last = stk.poll();
            }
            stk.push(x);
        }
        return true;
    }
}

C++

class Solution {
public:
    bool verifyPreorder(vector<int>& preorder) {
        stack<int> stk;
        int last = INT_MIN;
        for (int x : preorder)
        {
            if (x < last) return false;
            while (!stk.empty() && stk.top() < x)
            {
                last = stk.top();
                stk.pop();
            }
            stk.push(x);
        }
        return true;
    }
};

Go

func verifyPreorder(preorder []int) bool {
	var stk []int
	last := math.MinInt32
	for _, x := range preorder {
		if x < last {
			return false
		}
		for len(stk) > 0 && stk[len(stk)-1] < x {
			last = stk[len(stk)-1]
			stk = stk[0 : len(stk)-1]
		}
		stk = append(stk, x)
	}
	return true
}

...