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

被折叠的 条评论
为什么被折叠?



