难度:中等
给定一个二叉树,判断其是否是一个有效的二叉搜索树。
假设一个二叉搜索树具有如下特征:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
示例 1:
输入:
2
/ \
1 3
输出: true
示例 2:
输入:
5
/ \
1 4
/ \
3 6
输出: false
解释: 输入为: [5,1,4,null,null,3,6]。
根节点的值为 5 ,但是其右子节点值为 4 。
C++:递归算法
模板:
1、找到停止条件。(如果节点为null,不需要比较,返回true)
2、哪种遍历算法合适?前序/中序/后序/层序?(二叉搜索树的特点:当中序遍历时,遍历结果从小到大排列)
思路:
1、先查看节点的左子树是否为二叉搜索树;
2、比较当前节点的值是否比左孩子的值大;
3、如果比较大,说明当前节点与左孩子满足二叉搜索树,将动态指针指向当前节点,然后继续判断节点的右子树是否为二叉搜索树;
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
double pre = (double)INT_MIN-1;//指定最小值
bool isValidBST(TreeNode* root) {
if(!root) return true; //当节点为Null时,返回true
if(isValidBST(root->left) && root->val > pre){ // 先判断当前节点左子树是否为二叉搜索树,再判断当前节点与左孩子是否满足二叉搜索树
pre = root->val; // 中序遍历时,二叉搜索树从小到大排列,将当前节点的值作为前一个值
return isValidBST(root->right); // 判断当前节点的右子树是否满足二叉搜索树
}
return false;
}
};
这篇博客介绍了如何使用递归算法判断一个给定的二叉树是否为有效的二叉搜索树。首先,通过检查节点是否为空作为停止条件。接着,采用中序遍历策略,确保节点的左子树值小于当前节点且右子树值大于当前节点。通过递归地检查左右子树来验证整个树的合法性。示例中给出了两个例子,一个符合二叉搜索树的定义,另一个不符合。代码实现是用C++完成的。
744

被折叠的 条评论
为什么被折叠?



