描述
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| 输入: 2 / \ 1 3 输出: true
```c 示例 2:
输入: 5 / \ 1 4 / \ 3 6 输出: false
解释: 输入为: [5,1,4,null,null,3,6]。 根节点的值为 5 ,但是其右子节点值为 4 。
|
来源:力扣(LeetCode)
链接:98. Validate Binary Search Tree
解题思路
严格根据本题所提供的BST性质,即节点值的排序是左<根<右,那么本题有多种解法,大体上都是利用中序遍历来比较遍历出来的数据是否严格有序。
而二叉树的中序遍历可以有多种解法,递归、迭代,迭代分是否采用栈。
递归的话代码比较简介,不过对于Leetcode上面的题目,为了保证原函数的接口性,掩藏内部的实现细节,通常需要自己写一个辅助的递归函数,具体代码如下:
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
bool helper(struct TreeNode* root, long min, long max){ if(!root) return true; if(root->val >= max || root->val <= min) return false; return helper(root->left, min, root->val) && helper(root->right, root->val, max); }
bool isValidBST(struct TreeNode* root){ return helper(root, LONG_MIN, LONG_MAX);
}
|