leetcode1305(两棵二叉搜索树中的所有元素)--C语言实现

早过忘川 提交于 2020-08-16 01:52:40

求:

给你 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;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!