前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Swift 验证二叉搜索树- LeetCode

Swift 验证二叉搜索树- LeetCode

作者头像
韦弦zhy
发布2018-12-19 14:54:44
9240
发布2018-12-19 14:54:44
举报

LeetCode

题目: 验证二叉搜索树

验证二叉搜索树 给定一个二叉树,判断其是否是一个有效的二叉搜索树。

假设一个二叉搜索树具有如下特征:

  • 节点的左子树只包含小于当前节点的数。
  • 节点的右子树只包含大于当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例1:

代码语言:javascript
复制
输入:
    2
   / \
  1   3

输出: true

示例2:

代码语言:javascript
复制
输入:
    5
   / \
  1   4
     / \
    3   6

输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
     根节点的值为 5 ,但是其右子节点值为 4 。
方案一:
  • 二叉搜索树遍历后是一个有序数组
  • 二叉树前序遍历并存储节点,比较前值和后值,前值比后值大则非有序
代码一:
代码语言:javascript
复制
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public var val: Int
 *     public var left: TreeNode?
 *     public var right: TreeNode?
 *     public init(_ val: Int) {
 *         self.val = val
 *         self.left = nil
 *         self.right = nil
 *     }
 * }
 */

class Solution {
    func isValidBST(_ root: TreeNode?) -> Bool {
        guard root != nil else { return true }
        var stack = [TreeNode](), node = root, pre: TreeNode? = nil
        while node != nil || !stack.isEmpty {
            while node != nil {
                stack.append(node!)
                node = node!.left
            }
            node = stack.removeLast()
            if pre != nil && pre!.val >= node!.val {
                return false;
            }
            pre = node
            node = node!.right
        }
        return true
    }
}
方案二:
  • 二叉搜索树的左节点一定小于根节点
  • 二叉搜索树的右节点一定大于根节点
代码二:
代码语言:javascript
复制
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     public var val: Int
 *     public var left: TreeNode?
 *     public var right: TreeNode?
 *     public init(_ val: Int) {
 *         self.val = val
 *         self.left = nil
 *         self.right = nil
 *     }
 * }
 */
 
class Solution {
    func isValidBST(_ root: TreeNode?) -> Bool {
        return isValidBSTUtil(root, Int.min, Int.max);
    }
    
    func isValidBSTUtil(_ node: TreeNode?,_ min: Int,_ max: Int) -> Bool {
        guard let node = node else {
            return true
        }
        //左节点需要小于根节点值,右节点需要大于根节点
        guard node.val > min && node.val < max else {
            return false
        }
        return isValidBSTUtil(node.left, min, node.val) && isValidBSTUtil(node.right, node.val, max)
    }
}

isValidBSTUtil(node.left, min, node.val) && isValidBSTUtil(node.right, node.val, max) 取一个切片: isValidBSTUtil(node.left, min, node.val) 此时,

  • 函数内的 node.val 就是 root.left.val
  • 函数内的 min 就是 min
  • 函数内的 max 就是 root.val
代码语言:javascript
复制
node.val < max  ->  root.left.val < root.val
node.val > min  ->  root.left.val > min

取另一个一个切片: isValidBSTUtil(node.right, node.val, max) 此时,

  • 函数内的 node.val 就是 root.right.val
  • 函数内的 min 就是 root.val
  • 函数内的 max 就是 max
代码语言:javascript
复制
node.val < max  ->  root.right.val < max
node.val > min  ->  root.right.val > root.val 

换种写法可能更好理解

代码语言:javascript
复制
//左节点需要小于根节点值,右节点需要大于根节点
 guard node.val > min && node.val < max else {
   return false
 }

/*-------------to---------------->>>>/*

if let min = min, node.val <= min {
  return false
}

if let max = max, node.val >= max {
  return false
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.11.29 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目: 验证二叉搜索树
    • 方案一:
      • 代码一:
        • 方案二:
          • 代码二:
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档