题目
两颗二叉搜索树中的所有元素
思路 1
先前序遍历两个二叉搜索树,将所有节点的值存放至vector<int>
中,然后在进行排序。
思路 2
先进行中序遍历,得到两个二叉搜索树对应的数组,该数组均为有序(从小到大),然后进行归并即可。
题解
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
|
class Solution { public: vector<int> res; void preTraverse(TreeNode* root) { if(root == nullptr) return; res.push_back(root->val); preTraverse(root->left); preTraverse(root->right); } vector<int> getAllElements(TreeNode* root1, TreeNode* root2) { preTraverse(root1); preTraverse(root2); sort(res.begin(), res.end()); return res; } };
|
- 时间复杂度:O((n + m) \ log(n + m)),其中 n 和 m* 分别为两棵二叉搜索树的节点个数。
- 空间复杂度:O(n + m)
执行用时:120 ms, 在所有 C++ 提交中击败了82.38%的用户
内存消耗:83.3 MB, 在所有 C++ 提交中击败了60.43%的用户
通过测试用例:48 / 48
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
class Solution { public: vector<int> res; void InoTraversal(TreeNode* root, vector<int>& nums){ if(root == nullptr) return; InoTraversal(root->left, nums); nums.push_back(root->val); InoTraversal(root->right, nums); } vector<int> getAllElements(TreeNode* root1, TreeNode* root2) { vector<int> nums1, nums2; InoTraversal(root1, nums1); InoTraversal(root2, nums2);
int i = 0, j = 0; while(i < nums1.size() && j < nums2.size()){ if(nums1[i] < nums2[j]) res.push_back(nums1[i++]); else res.push_back(nums2[j++]); } while(i < nums1.size()) res.push_back(nums1[i++]); while(j < nums2.size()) res.push_back(nums2[j++]);
return res; } };
|
- 时间复杂度:O((n + m)),其中 n 和 m 分别为两棵二叉搜索树的节点个数。
- 空间复杂度:O(n + m)
执行用时:116 ms, 在所有 C++ 提交中击败了88.62%的用户
内存消耗:85.4 MB, 在所有 C++ 提交中击败了6.23%的用户
通过测试用例:48 / 48