求:
给你 root1 和 root2 这两棵二叉搜索树。
请你返回一个列表,其中包含 两棵树 中的所有整数并按 升序 排序。.
示例 1:
输入:root1 = [2,1,4], root2 = [1,0,3]
输出:[0,1,1,2,3,4]
示例 2:
输入:root1 = [0,-10,10], root2 = [5,1,7,0,2]
输出:[-10,0,0,1,2,5,7,10]
示例 3:
输入:root1 = [], root2 = [5,1,7,0,2]
输出:[0,1,2,5,7]
示例 4:
输入:root1 = [0,-10,10], root2 = []
输出:[-10,0,10]
示例 5:
输入:root1 = [1,null,8], root2 = [8,1]
输出:[1,1,8,8]
提示:
每棵树最多有 5000 个节点。
每个节点的值在 [-10^5, 10^5] 之间。
解:
思路:本题最直观的思路有2种:
1、根据题意,最多有10000个整数。创建一个可以容纳10000个整数的数组,然后对题目给出的2颗树使用任意方式进行遍历,最后对数组进行快速排序即可。
2、可以在1的思路上继续做优化,根据二叉搜索树性质,中序遍历得到的值单调递增。因此我们使用2个最多可以容纳5000个整数的数组分别存储2颗树中序遍历的结果,然后使用2个指针指向2个数组,每一次都将较小者放入最终数组中(容量是10000),将相应的指针向后移动,当2个指针分别到达数组结尾时,说明已经归并完成,返回结果。
注意这里假定树只有少量节点的情况是小概率的,否则可以考虑使用链表方式代替数组实现进行存放元素,节约空间。
#ifndef
ARRSIZE
#define ARRSIZE
5000
#endif
void
Traverse(
struct
TreeNode* root,
int
* arr,
int
* idx){
if
(root == NULL)
return
;
Traverse(root->left,arr,idx);
arr[(*idx)++] = root->val;
Traverse(root->right,arr,idx);
}
int
* getAllElements(
struct
TreeNode* root1,
struct
TreeNode* root2,
int
* returnSize){
if
(root1 == NULL && root2 == NULL)
return
NULL;
*returnSize =
0
;
int
* arr1 = (
int
*)malloc(
sizeof
(
int
) * ARRSIZE);
int
* arr2 = (
int
*)malloc(
sizeof
(
int
) * ARRSIZE);
int
* ret = (
int
*)malloc(
sizeof
(
int
) * ARRSIZE *
2
);
int
idx1 =
0
,idx2 =
0
;
int
idx =
0
;
Traverse(root1, arr1, &idx1);
Traverse(root2, arr2, &idx2);
int
i,j;
for
(i=
0
,j=
0
;i<idx1 && j<idx2;) ret[idx++] = arr1[i]<arr2[j]?arr1[i++]:arr2[j++];
while
(i<idx1) ret[idx++] = arr1[i++];
while
(j<idx2) ret[idx++] = arr2[j++];
free(arr1);
free(arr2);
*returnSize = idx;
return
ret;
}
来源:oschina
链接:https://my.oschina.net/u/4469818/blog/4290068