立志重刷代码随想录60天冲冲冲!!——第十七天

654.最大二叉树

class Solution {
public:
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {
    // 构造二叉树,都需要用到前序,中左右
        if (nums.size() == 1) {
            return new TreeNode(nums[0]);
        }
        int index = 0;
        int MaxValue = 0;
        // 找到最大值 (中)
        for (int i = 0; i < nums.size(); i++) {
            if (nums[i] > MaxValue) {
                MaxValue = nums[i];
                index = i; // 记录此时最大值索引
            }
        }
        TreeNode* node = new TreeNode(MaxValue);

        // (左) 左边最少需要有一个元素
        if (index > 0) {
            vector<int> NewVector(nums.begin(), nums.begin() + index);
            node->left = constructMaximumBinaryTree(NewVector);
        }

        // (右) 右边也需要最少一个元素
        if (index < nums.size() - 1) {
            vector<int> NewVector(nums.begin() + index + 1, nums.end());
            node->right = constructMaximumBinaryTree(NewVector);
        }

        return node;
    }
};

617.合并二叉树

class Solution {
public:
    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {
        if (root1 == nullptr) return root2;
        if (root2 == nullptr) return root1;

        TreeNode* root = new TreeNode(0);
        // 前序
        // 中
        root->val = root1->val + root2->val;
        // 左
        root->left = mergeTrees(root1->left, root2->left);
        // 右
        root->right = mergeTrees(root1->right, root2->right);

        return root;
    }
};

700.二叉搜索树中的搜索

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

98.验证二叉搜索树

非最优,但思路简单

class Solution {
public:
    // 二叉搜索树,中序遍历,是有序的
    void GetVector(TreeNode* node, vector<int>& vec) {
        if (node == nullptr) return;
        if (node->left) GetVector(node->left, vec);
        vec.push_back(node->val);
        if (node->right) GetVector(node->right, vec);
    }
    bool isValidBST(TreeNode* root) {
        vector<int> vec;
        GetVector(root, vec);
        for (int i = 0; i < vec.size() - 1; i++) {
            if (vec[i] >= vec[i+1]) return false;
        }
        return true;
    }
};

最优解,直接在遍历过程中,使用双指针比较大小。

class Solution {
public:
    // 记录前一个节点
    TreeNode* pre = NULL;

    bool isValidBST(TreeNode* root) {
        if (root == nullptr) 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;
    }
};

代码随想录更新 文章被收录于专栏

冲冲冲冲冲冲!

全部评论

相关推荐

10-30 10:16
南京大学 Java
龚至诚:给南大✌️跪了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务