代码随想录day17

654.最大二叉树

    TreeNode* traverse(vector<int>& nums){
        if(nums.size() == 0){
            return nullptr;
        }
        if(nums.size() == 1){
            return new TreeNode(nums[0]);
        }
        int max_index = 0;
        int max = INT_MIN;
        for(int i = 0;i < nums.size(); i++){
            if(nums[i] > max){
                max = nums[i];
                max_index = i;
            }
        }
        TreeNode* root = new TreeNode(max);
        vector<int> leftnums(nums.begin(),nums.begin()+max_index);
        vector<int> rightnums(nums.begin()+max_index+1, nums.end());
        root->left = traverse(leftnums);
        root->right = traverse(rightnums);
        return root;
    }
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        if(nums.size() == 0){
            return nullptr;
        }
        return traverse(nums);
    }

617.合并二叉树

    TreeNode* traverse(TreeNode* root1, TreeNode* root2){
        if(root1 == nullptr && root2 == nullptr){
            return nullptr;
        }
        if(root1 == nullptr && root2 != nullptr){
            return root2;
        }
        if(root2 == nullptr && root1 != nullptr){
            return root1;
        }
        TreeNode* root = new TreeNode(root1->val + root2->val);
        root->left = traverse(root1->left, root2->left);
        root->right = traverse(root1->right, root2->right);
        return root;
    }
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(root1 == nullptr && root2 == nullptr){
            return nullptr;
        }
        return traverse(root1, root2);
    }

700.二叉搜索树中的搜索

    TreeNode* searchBST(TreeNode* root, int val) {
       if(root == nullptr){
        return nullptr;
       } 
       if(root->val == val){
        return root;
       }
       
       TreeNode* left_node = searchBST(root->left, val);
       TreeNode* right_node = searchBST(root->right, val);
       if(left_node) return left_node;
       if(right_node) return right_node;
       return nullptr;
    }

98.验证有效二叉搜索树

//容易进入误区

bool traverse(TreeNode* node){
        if(node == nullptr){
            return true;
        }
        //错误理解,二叉搜索树是整个左子树比当前节点小,右子树比当前节点大,而非局部子树内满足就可以
        if(node->left && node->left->val >= node->val){
            return false;
        }
        if(node->right && node->right->val <= node->val){
            return false;
        }
        bool left_flag = traverse(node->left);
        bool right_flag = traverse(node->right);
        if(!left_flag || !right_flag){
            return false;
        }
        return true;

    }
    bool isValidBST(TreeNode* root) {
        return traverse(root); 
    }

//正确写法

    TreeNode* pre;
    bool isValidBST(TreeNode* root) {
        if(root == nullptr){
            return true;
        }
        
        bool left_flag = isValidBST(root->left);

        if(pre && pre->val >= root->val){
            return false;
        }
        pre = root;

        bool right_flag = isValidBST(root->right);
        return left_flag && right_flag;
        
        
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值