引言
- 使用数据范围可以,在合适的场景简化问题
- 中序遍历的有序性方便判定二叉搜索树
栈的多变性,在于并非是连续进或出, 而是进出不均等。
如对弹出元素相关性分析,确定是否有新关联元素入栈,换而言之,当前出栈的元素连续的后一出栈元素,未必就是当下栈顶元素。
如下所示,d 出 e入 再出是e而非最先留下的 c
问题
判断给出的二叉树是否是一个二叉搜索树(BST)
二叉搜索树的定义如下
一个节点的左子树上节点的值都小于自身的节点值
一个节点的右子树上节点的值都大于自身的节点值
所有节点的左右子树都必须是二叉搜索树
1
/ \
2 3
/
4
\
5
golang 方案
特点在于,二叉树每个节点都存在一个上限与下限,因此可假定目之所及的最小与最大范围数,简单直接
import "math"
func isValidBST( root *TreeNode ) bool {
left,right := math.MinInt32,math.MaxInt32
return helper(root,left,right)
}
func helper(root *TreeNode, left, right int) bool{
if root == nil {
return true
}
if root.Val <= left || root.Val >= right {
return false
}
return helper(root.Left, left, root.Val) && helper(root.Right, root.Val, right)
}
python 中序
构建中序数组,判定是否存在无序不重复列表,
关键在于区分上次弹出的数未必就连着当下弹出的,即出栈与出栈之间存在新元素加入,即插队现象
class Solution:
def isValidBST(self , root ):
if root is None:
return True
stack = []
cur,prev = root,None
while len(stack) or cur:
if cur:
stack.append(cur)
cur=cur.left
else:
cur = stack.pop()
if prev and prev.val >= cur.val:
return False
prev = cur
cur = cur.right
return True
栈一端进进出出,不一定守规矩,可能存在出栈的裙带关系者入栈,打断连续出栈动作