代码随想录算法训练营第十九天 | LeeCode 654. 最大二叉树,617. 合并二叉树 ,700. 二叉搜索树中的搜索,98. 验证二叉搜索树

题目链接:654. 最大二叉树 - 力扣(LeetCode)

class Solution
{
public:
    TreeNode *constructMaximumBinaryTree(vector<int> &nums)
    {
        if(nums.size()==0) return nullptr;
        int max=INT_MIN;
        int i=0;

        for(i=0;i<nums.size();i++){
            if(nums[i]>max){
                max=nums[i];
            } 
        }
        for(i=0;i<nums.size();i++){
            if(nums[i]==max) break;
        }

        vector<int> left(nums.begin(),nums.begin()+i);
        vector<int> right(nums.begin()+i+1,nums.end());

        TreeNode *root=new TreeNode(max);

        root->left=constructMaximumBinaryTree(left);
        root->right=constructMaximumBinaryTree(right);
        
        return root;
    }
};

和昨天中序后序构造二叉树有异曲同工之妙,有了昨天的经验,顺利做出来了。

总之就是找到最大值,然后分割数组,分别把左右数组进递归就行。

题目链接:617. 合并二叉树 - 力扣(LeetCode)

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

递归方法解决。通过这几天的递归练习,逐渐掌握了一些思想。

两个树同时找结点,如果都存在就相加,如果一方不存在就用另一方,如果都不存在就返回空。

题目链接:700. 二叉搜索树中的搜索 - 力扣(LeetCode)

class Solution {
public:
    TreeNode* searchBST(TreeNode* root, int val) {
        if (root == NULL || root->val == val) return root;
        TreeNode* result = NULL;
        if (root->val > val) result = searchBST(root->left, val);
        if (root->val < val) result = searchBST(root->right, val);
        return result;
    }
};

二叉搜索树就是小的在根节点左边,大的在根节点右边。

判断是否为空或等于要找的值,然后返回根节点,这个就是要找的,也是找到对应的值的返回。

单层判断逻辑就是当前结点大于要val,就往左找,小于就往右找。return结果回来就行。最后通过 result一层层把值传递。

题目链接:98. 验证二叉搜索树 - 力扣(LeetCode)

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;
    }
};

二叉搜索树的中序遍历是递增的。按这个逻辑来中序遍历就能解题。

定义一个类属性能辅助我们解题,类似于acm里面可以定义一个全局变量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值