day18 二叉搜索树

二叉搜索树特点

  • 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
  • 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
  • 它的左、右子树也分别为二叉搜索树
    class Solution {
    public:
        TreeNode* searchBST(TreeNode* root, int val) {
            if (root == NULL || root->val == val) return root;
            if(root->val<val) return searchBST(root->right,val);
            if(root->val>val) return searchBST(root->left,val);
            return NULL;
        }
    };

  • 二叉搜索树特点:中序遍历数据由小到大

  • 思路1:额外定义数组vector存储中序遍历结果,判断后一个元素是否大于等于前一个即可

  • 思路2:递归,中序遍历,定义一个最大值,若maxval更新过程中小于当前val则为false

  • class Solution {
    public:
    long long maxVal = LONG_MIN; // 因为后台测试数据中有int最小值
        bool isValidBST(TreeNode* root) {
            //中序遍历搜索二叉树的结果是有序数列
            if(root==NULL) return true;
           bool left=isValidBST(root->left);
           if(maxVal<root->val) maxVal=root->val;
           else return false;
           bool right=isValidBST(root->right);
            return left&&right;
        }
    };
    class Solution {
    public:
        TreeNode* pre = NULL; // 用来记录前一个节点
        bool isValidBST(TreeNode* root) {
            if (root == NULL) return true;
            bool left = isValidBST(root->left);
    
            if (pre != NULL && pre->val >= root->val) return false;
            pre = root; // 记录前一个节点
    
            bool right = isValidBST(root->right);
            return left && right;
        }
    };

  • class Solution {
    public:
        int result = INT_MAX;
        TreeNode*pre=NULL;//前一个指针
        int getMinimumDifference(TreeNode* root) {
            if(root!=NULL){
            getMinimumDifference(root->left);
            if(pre!=NULL&&root!=NULL){
                result=min(result,root->val-pre->val);
            }
            pre=root;
            getMinimumDifference(root->right);
            }
            return result;
           
        }
    };

  • class Solution {
    private:
        int maxCount = 0; // 最大频率
        int count = 0; // 统计频率
        TreeNode* pre = NULL;
        vector<int> result;
        void searchBST(TreeNode* cur) {
            if (cur == NULL) return ;
    
            searchBST(cur->left);       // 左
                                        // 中
            if (pre == NULL) { // 第一个节点
                count = 1;
            } else if (pre->val == cur->val) { // 与前一个节点数值相同
                count++;
            } else { // 与前一个节点数值不同
                count = 1;
            }
            pre = cur; // 更新上一个节点
    
            if (count == maxCount) { // 如果和最大值相同,放进result中
                result.push_back(cur->val);
            }
    
            if (count > maxCount) { // 如果计数大于最大值频率
                maxCount = count;   // 更新最大频率
                result.clear();     // 很关键的一步,不要忘记清空result,之前result里的元素都失效了
                result.push_back(cur->val);
            }
    
            searchBST(cur->right);      // 右
            return ;
        }
    
    public:
        vector<int> findMode(TreeNode* root) {
            count = 0;
            maxCount = 0;
            pre = NULL; // 记录前一个节点
            result.clear();
    
            searchBST(root);
            return result;
        }
    };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值