golang 判断是否为二叉搜索树

引言

  • 使用数据范围可以,在合适的场景简化问题
  • 中序遍历的有序性方便判定二叉搜索树
    栈的多变性,在于并非是连续进或出, 而是进出不均等。
    如对弹出元素相关性分析,确定是否有新关联元素入栈,换而言之,当前出栈的元素连续的后一出栈元素,未必就是当下栈顶元素。
    如下所示,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

栈一端进进出出,不一定守规矩,可能存在出栈的裙带关系者入栈,打断连续出栈动作

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值