持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
题目
给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。
有效 二叉搜索树定义如下:
- 节点的左子树只包含 小于 当前节点的数。
- 节点的右子树只包含 大于 当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1
输入:root = [2,1,3]
输出:true
示例 2
输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。
提示
- 树中节点数目范围在[1, 104] 内
- -2^31 <= Node.val <= 2^31 - 1
题解
思路
二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点:
- 若其左子树存在,则其左子树中每个节点的值都小于该节点值;
- 若其右子树存在,则其右子树中每个节点的值都大于该节点值。
我们知道二叉搜索树中序遍历得到的值构成的序列一定是升序的的。因此我们可以对二叉树进行中序遍历,判断当前节点是否大于中序遍历的前一个节点,如果大于,说明说明这个序列是升序的,整棵树是二叉搜索树,否则不是。
过程:
- 我们定义一个节点变量pre用来记录中序遍历的前一个节点。
- 中序遍历二叉树,在遍历过程中判断当前节点是否大于中序遍历的前一个节点。如果大于不做任何处理,如果小于等于说明不满足二叉搜索树的性质,返回false。
细节:
- pre节点的初始值要设置为null。
- 具体实现过程看代码。
代码
class Solution {
public:
TreeNode* pre = nullptr;
bool isValidBST(TreeNode* root) {
if(!root)
return true;
//判断当前节点的左子树是否满足二叉搜索树,如果不满足,直接返回false,无序递归右子树
if(!isValidBST(root->left)) return false;
//如果前一个节点不为空并且当前节点<=前一个节点,直接返回false
if( pre && root->val <= pre->val) return false;
//否则,将当前节点设置为pre
pre = root;
return isValidBST(root->right);
}
};
结语
业精于勤,荒于嬉;行成于思,毁于随。