Day 20 | 654.最大二叉树 617.合并二叉树 700.二叉搜索树中的搜索 98.验证二叉搜索树

 654.最大二叉树

  TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        if(nums.size() == 0) return NULL;//先处理空节点
        int maxIndex;//接收最大值的下标
        int maxval = INT_MIN;
        for(int i = 0; i < nums.size(); ++i){
            if(maxval < nums[i]){
                maxval = nums[i];//更新最大值
                maxIndex = i;
        }
        }
        TreeNode* root = new TreeNode(nums[maxIndex]);//当拿到最大值后进行节点创建
        if(nums.size() == 1) return root;//当nums划分的只剩一个的时候,说明此节点为叶子结点,到头了,那就return

        vector<int> left(nums.begin(), nums.begin() + maxIndex);//左闭右开画出左边
        vector<int> right(nums.begin() + maxIndex + 1, nums.end());//左闭右开画出右边

        root->left = constructMaximumBinaryTree(left);//分别对左右各自处理
        root->right = constructMaximumBinaryTree(right);

        return root;
    }

617.合并二叉树

TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if(!root1 && !root2) return NULL;//可有可无,没有的话也是最后直接return
        else if(!root1 && root2) return root2;
        else if(root1 && !root2) return root1;
        root1->val += root2->val;//将头结点相加
        root1->left = mergeTrees(root1->left,root2->left);//处理左子树
        root1->right = mergeTrees(root1->right,root2->right);//处理右子树
        return root1;
    }

700.二叉搜索树中的搜索

 TreeNode* searchBST(TreeNode* root, int val) {
        if(root == NULL) return root;
        if(root->val == val) return root;
        if(val > root->val){
            return searchBST(root->right, val);
        }else return searchBST(root->left, val);
    }

 98.验证二叉搜索树

TreeNode* pre = NULL;
    bool isValidBST(TreeNode* root) {
        if(root == NULL) return true;//空节点也是二叉树
        bool left, right;
        left = isValidBST(root->left);
        if(pre != NULL){//当只有Pre节点指向叶子结点才比较
            if(pre->val >= root->val) return false;
            //这个判断不能写成true,必须要写false的情况
            //因为若直接true,那么直接有一个满足就退出去了,不会在检查后面的
        }
        pre = root;
        right = isValidBST(root->right);
        return left && right;
    }

 这里学到了个很重要的知识,中序遍历搜索树,那么遍历结果一定是递增的,以及如何在二叉树中使用双指针。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值