算法系列之验证二叉搜索树

本题来自Leetcode,题目传送门:「链接」

难度:中等

编程语言:Go

1. 题目介绍

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效二叉搜索树定义如下:

1. 节点的左子树只包含 小于 当前节点的数。

2. 节点的右子树只包含 大于 当前节点的数。

3. 所有左子树和右子树自身必须也是二叉搜索树。


示例 1:

引用自Leetcode

输入:root = [2,1,3]输出:true

示例 2:

引用自Leetcode

输入:root = [5,1,4,null,null,3,6]输出:false解释:根节点的值是 5 ,但是右子节点的值是4

提示:

1. 树中节点数目范围在[1, ] 内

2. <= Node.val <=

2. 解题思路

要确保是正确的二叉搜索树,则需要保证左小右大。如果所有父节点均满足此要求,则二叉搜索树合法。

由此可以看出这是一道典型的递归题。从root节点开始,如果左子树存在,则左子树成为判断的子树;同理右子树也是一样。

由于是二叉搜索树,则按照中序遍历的方法,则打印出来的结果应该是递增的序列。反映到算法上,则上一个节点值需要小于下一个节点值。

实现起来,先判断左节点,然后判断parent,然后判断右节点。保留上一个节点的值,当判断当前节点(current parent node)的时候,比较其大小,如果上一个节点值大于或者等于当前节点值,则返回false。

这种方法下:

1. 每一个元素需要一次遍历,时间复杂度为O(n);

2. 需要保留上一个节点值,空间复杂度为O(1)。(实现时要考虑到递归产生的方法栈,实际消耗的内存会比较多)

3. 源码展示

先上测试

方法实现

Leetcode运算结果

  • 执行用时: 8 ms
  • 内存消耗: 5 MB

生活依然要继续,每天拿出半个小时,放下焦虑,用行动来积累更好的自己,我们一起加油!

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章