Leetcode 每日一题 2022.05.01

本文介绍如何使用归并排序算法合并两个已排序的二叉搜索树,以获取一个按升序排列的整数列表。通过递归遍历和合并操作,展示了如何在保持搜索树特性的同时,高效地完成元素合并过程。

题目

1305. 两棵二叉搜索树中的所有元素

给你 root1 和 root2 这两棵二叉搜索树。请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。.

思路

由于二叉搜索树是有序的,左子节点小于中间节点,右子节点大于中间节点,因此两个搜索完的数也是有序的,因此选择归并排序即可。

代码

class Solution {
public:
vector<int> getElement(TreeNode* root) {
    vector<int> result;
    if (root->left == nullptr && root->right == nullptr) {
        result.push_back(root->val);
        return result;
    }

    vector<int> leftChild, rightChild;
    if (root->left != nullptr) {
        leftChild = getElement(root->left);
    }
    if (root->right != nullptr) {
        rightChild = getElement(root->right);
    }
    for (int num: leftChild) {
        result.push_back(num);
    }
    result.push_back(root->val);
    for (int num: rightChild) {
        result.push_back(num);
    }

    return result;
}

vector<int> getAllElements(TreeNode* root1, TreeNode* root2) {
    vector<int> result;
    vector<int> num1, num2;
    if (root1 != nullptr) {
        num1 = getElement(root1);
    }
    if (root2 != nullptr) {
        num2 = getElement(root2);
    }
    
    result.reserve(num1.size()+num2.size());//合并前需要准备空间

    int num1Idx(0), num2Idx(0);
    while (num1Idx < num1.size() || num2Idx < num2.size()) {
        if (num1Idx == num1.size()) {
            result.push_back(num2[num2Idx]);
            num2Idx++;
        } else if (num2Idx == num2.size()) {
            result.push_back(num1[num1Idx]);
            num1Idx++;
        } else if (num1[num1Idx] <= num2[num2Idx]) {
            result.push_back(num1[num1Idx]);
            num1Idx++;
        } else {
            result.push_back(num2[num2Idx]);
            num2Idx++;
        }
    }

    return result;
}
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值