判断二叉搜索树的合法性

二叉搜索树的特点:中序遍历时输出的顺序总是从小到大

/**
 * Definition for binary tree
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
   void midSort(vector<TreeNode*> &ret,TreeNode* root){
     if(root!=NULL){
         midSort(ret,root->left);
         ret.push_back(root);
         midSort(ret,root->right);
     }   
    }
    bool isValidBST(TreeNode *root) {
        if(root==NULL) return true;
        vector<TreeNode*> ret;
        midSort(ret,root);
        for(int i=1;i<ret.size();i++){
            if(ret[i]->val<=ret[i-1]->val) return false;
        }
        return true;
    }
};


### 判断或验证一个树是否为二叉搜索树判断一棵树是否为二叉搜索树(Binary Search Tree, BST),可以通过以下方法实现: #### 方法一:基于中序遍历的递增性 根据定义,如果一颗二叉树是二叉搜索树,则其中序遍历的结果应该是一个严格的递增序列。因此,可以在中序遍历时记录前驱节点的值,并比较当前节点与前驱节点的关系来验证该条件。 以下是具体实现方式: ```java int preValue = Integer.MIN_VALUE; public boolean isBinarySearchTree(TreeNode root){ if(root == null){ return true; } boolean left = isBinarySearchTree(root.left); if(root.val <= preValue){ // 当前节点值应大于前驱节点值 return false; } else { preValue = root.val; // 更新前驱节点值 } return left && isBinarySearchTree(root.right); // 继续检查右子树 } ``` 这种方法的时间复杂度为 O(n),空间复杂度取决于递归栈深度,最坏情况下为 O(n)[^2]。 --- #### 方法二:通过范围约束验证 另一种常见的方法是对每个节点设置合法取值范围 `(min, max)`,并递归地验证每颗子树中的所有节点是否满足此范围内的约束条件。对于任意节点 `root` 来说: - 左子树的所有节点值都必须小于 `root.val`; - 右子树的所有节点值都必须大于 `root.val`。 下面是具体的 Java 实现代码: ```java class Solution { public boolean isValidBST(TreeNode root) { return isValidBST(root, Long.MIN_VALUE, Long.MAX_VALUE); } private boolean isValidBST(TreeNode root, long lower, long upper) { if (root == null) { return true; } if (root.val <= lower || root.val >= upper) { // 节点值超出允许范围 return false; } if (!isValidBST(root.left, lower, root.val)) { // 验证左子树 return false; } if (!isValidBST(root.right, root.val, upper)) { // 验证右子树 return false; } return true; } } ``` 这种算法同样具有时间复杂度 O(n) 和空间复杂度 O(h),其中 h 是树的高度[^3]。 --- #### 方法三:C++ 版本的范围约束法 类似于方法二,在 C++ 中也可以采用相同的逻辑结构来进行验证。下面提供了一个等效版本: ```cpp bool helper(TreeNode* root, int minVal, int maxVal) { if (root == nullptr) return true; if ((root->val < maxVal || (root->val == maxVal && root->right == nullptr)) && (root->val > minVal || (root->val == minVal && root->left == nullptr)) && helper(root->left, minVal, root->val) && helper(root->right, root->val, maxVal)) { return true; } return false; } bool isValidBST(TreeNode* root) { if (root == nullptr) return true; return helper(root, INT_MIN, INT_MAX); } ``` 这里需要注意的是边界情况处理,比如当某个节点等于上下界时需额外考虑是否有对应方向的孩子节点存在[^4]。 --- 以上三种方法都可以有效判定给定的一棵树是否属于二叉搜索树类别之一。实际应用过程中可根据个人习惯选择合适的方式加以运用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值