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

654. 最大二叉树

题目链接:654. 最大二叉树

此题类似构建二叉树,也是对数组进行切割。主要思路就是找到数组中最大值作为根节点,左边数组为左子树,右边数组为右子树。

class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
        if (nums.size() == 0) return nullptr;
        TreeNode* root = new TreeNode(0);
        if (nums.size() == 1) {
            root->val = nums[0];
            return root;
        }
        int maxvalue = 0, index = 0;
        for (int i = 0; i < nums.size(); i++) {
            if (maxvalue < nums[i]) {
                maxvalue = nums[i];
                index = i;
            }
        }
        root->val = maxvalue;
        vector<int> leftNums(nums.begin(), nums.begin() + index);
        vector<int> rightNums(nums.begin() + index + 1, nums.end());
        root->left = constructMaximumBinaryTree(leftNums); 
        root->right = constructMaximumBinaryTree(rightNums);
        return root;
    }
};

617. 合并二叉树

题目链接:617. 合并二叉树

  • 左子树为空,返回右子树,即使右子树为空,返回的是null
  • 右子树为空,返回左子树,即使左子树为空,返回的是null
  • 借用左子树构造二叉树,不用新建立节点了
class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if (root1 == nullptr) return root2;
        if (root2 == nullptr) return root1;
        root1->val += root2->val;  //直接加在左子树
        root1->left = mergeTrees(root1->left, root2->left);
        root1->right = mergeTrees(root1->right, root2->right);
        return root1;
    }
};

700. 二叉搜索树中的搜索

题目链接:700. 二叉搜索树中的搜索

注意二叉搜索树的性质,左子树的所有值比跟节点小,右子树的所有值比节点大。

利用这个性质,可以使得题目非常简单。

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

迭代法

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

98. 验证二叉搜索树

题目链接:98. 验证二叉搜索树

注意二叉搜索树的性质,用root->val > root->left->val && root->val < root->right->val判断是不对的,例如如下情况
在这里插入图片描述
此二叉树满足上述条件判断,但是6比10小,不满足二叉搜索树的条件。

采用中序遍历,使用一个指针不断记录前一个节点值(左节点),和根节点比较。
其他方法也可以定义一个最大值不断保存上一个节点的值,如果此值大于根节点的值,则返回false,但是输入案例中存在int 的最小值,所以应该定义为long long型,但是如果存在long long最小值,就不好操作了。

class Solution {
public:
    TreeNode* pre = nullptr;
    bool isValidBST(TreeNode* root) {
        if(root == nullptr) return true;
        bool left = isValidBST(root->left); //左
        
        if(pre != nullptr && pre->val >= root->val) return false; //中
        pre = root;
        bool right = isValidBST(root->right); //右

        return left && right;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值