本题来自Leetcode,题目传送门:「链接」
难度:中等
编程语言:Go
给你一个二叉树的根节点 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 <=
要确保是正确的二叉搜索树,则需要保证左小右大。如果所有父节点均满足此要求,则二叉搜索树合法。
由此可以看出这是一道典型的递归题。从root节点开始,如果左子树存在,则左子树成为判断的子树;同理右子树也是一样。
由于是二叉搜索树,则按照中序遍历的方法,则打印出来的结果应该是递增的序列。反映到算法上,则上一个节点值需要小于下一个节点值。
实现起来,先判断左节点,然后判断parent,然后判断右节点。保留上一个节点的值,当判断当前节点(current parent node)的时候,比较其大小,如果上一个节点值大于或者等于当前节点值,则返回false。
这种方法下:
1. 每一个元素需要一次遍历,时间复杂度为O(n);
2. 需要保留上一个节点值,空间复杂度为O(1)。(实现时要考虑到递归产生的方法栈,实际消耗的内存会比较多)
先上测试
方法实现
Leetcode运算结果
生活依然要继续,每天拿出半个小时,放下焦虑,用行动来积累更好的自己,我们一起加油!
| 留言与评论(共有 0 条评论) “” |