day20|C++|Leetcode|654. 最大二叉树| 617. 合并二叉树| 700. 二叉搜索树中的搜索|98. 验证二叉搜索树

Leetcode 654. 最大二叉树

链接654. 最大二叉树

thought:

  • 本题只要想明白递归函数需要哪些参数后解题就十分简单
  • 首先是每轮递归的l和r一定是要有的,其次原数组nums也要保留,我们创建的根指针也要进入,这里提示一下,通过引用的方式,你可以用new指针为辅函数的指针参数动态分配内存空间
  • 先序遍历,每轮操作就是遍历当前 l 到 r ,找最大值,开辟空间确立子树,然后向下递归

完整C++代码如下

class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        if (nums.empty())
            return NULL;
        TreeNode* root = NULL;
        traversal(0, nums.size() - 1, nums, root);
        return root;
    }
    void traversal(int l, int r, vector<int>& nums, TreeNode*& root) {
        if (l > r)
            return;
        int numNow = INT_MIN;
        int num;
        for (int i = l; i <= r; i++) {
            if (numNow < nums[i]) {
                numNow = nums[i];
                num = i;
            }
        }
        root = new TreeNode(numNow);
        traversal(l, num - 1, nums, root->left);
        traversal(num + 1, r, nums, root->right);
    }
};

Leetcode 617. 合并二叉树

链接617. 合并二叉树

thought:

本题我的第一想法是采用层序遍历,两个二叉树同时遍历,将第二个二叉树值加到第一个二叉树上,但我在思考当两个二叉树遍历到某个位置第二个二叉树有值,第一个二叉树为空时该怎样为第一个二叉树遍历处开辟空间犯了难,新位置部分每个节点都要开辟空间,求助gpt后发现直接把node1->left = node2->left;即可,哈哈

完整C++代码如下

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if (!root1) return root2;
        if (!root2) return root1;
        queue<pair<TreeNode*, TreeNode*>> que;
        que.push({root1, root2});
        while (!que.empty()) {
            int size = que.size();
            for (int i = 0; i < size; i++) {
                pair<TreeNode*, TreeNode*> temp = que.front();
                TreeNode* node1 = temp.first;
                TreeNode* node2 = temp.second;
                node1->val += node2->val;
                // Check and add left child nodes
                if (node1->left && node2->left)
                    que.push({node1->left, node2->left});
                else if (!node1->left && node2->left)
                    node1->left = node2->left;//无push
                
                // Check and add right child nodes
                if (node1->right && node2->right)
                    que.push({node1->right, node2->right});
                else if (!node1->right && node2->right)
                    node1->right = node2->right;//无push
                
                que.pop();
            }
        }
        return root1;
    }
};

PS:本题也可以直接建立两个栈


Leetcode 700. 二叉搜索树中的搜索

链接700. 二叉搜索树中的搜索

thought:

前序遍历快速解决

完整C++代码如下

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

Leetcode 98. 验证二叉搜索树

链接98. 验证二叉搜索树

thought:

二叉搜索树中,中序遍历为升序

完整C++代码如下

class Solution {
public:
    bool isValidBST(TreeNode* root) {
        vector<int>vec;
        traversal(root,vec);
        for(int i=0;i<vec.size()-1;i++){
            if(vec[i]>=vec[i+1])return false;
        }
        return true;
    }
    void traversal(TreeNode* root,vector<int>&vec){
        if(!root)return;
        if(root->left)traversal(root->left,vec);
        vec.push_back(root->val);
        if(root->right)traversal(root->right,vec);
        
    }
};
  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值