使用C语言编写下列代码:给你两颗二叉搜索树,如何使用线性的时间复杂度,将它们合并成一颗二叉搜索树。
时间: 2023-05-24 16:06:03 浏览: 100
以下是使用C语言编写的合并两颗二叉搜索树的代码:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义二叉树结构体
struct TreeNode {
int val;
struct TreeNode* left;
struct TreeNode* right;
};
// 插入节点
void insert(struct TreeNode** root, int val) {
if (*root == NULL) {
struct TreeNode* new_node = (struct TreeNode*) malloc(sizeof(struct TreeNode));
new_node->val = val;
new_node->left = NULL;
new_node->right = NULL;
*root = new_node;
}
else if (val < (*root)->val) {
insert(&((*root)->left), val);
}
else {
insert(&((*root)->right), val);
}
}
// 中序遍历输出
void inorder(struct TreeNode* root) {
if (root != NULL) {
inorder(root->left);
printf("%d ", root->val);
inorder(root->right);
}
}
// 合并两颗二叉搜索树
struct TreeNode* mergeTrees(struct TreeNode* t1, struct TreeNode* t2) {
if (t1 == NULL) {
return t2;
}
if (t2 == NULL) {
return t1;
}
struct TreeNode* new_node = (struct TreeNode*) malloc(sizeof(struct TreeNode));
new_node->val = t1->val + t2->val;
new_node->left = mergeTrees(t1->left, t2->left);
new_node->right = mergeTrees(t1->right, t2->right);
return new_node;
}
int main() {
// 创建第一颗二叉搜索树
struct TreeNode* root1 = NULL;
insert(&root1, 5);
insert(&root1, 3);
insert(&root1, 6);
insert(&root1, 2);
insert(&root1, 4);
insert(&root1, 7);
printf("Tree 1: ");
inorder(root1);
printf("\n");
// 创建第二颗二叉搜索树
struct TreeNode* root2 = NULL;
insert(&root2, 10);
insert(&root2, 8);
insert(&root2, 15);
insert(&root2, 13);
insert(&root2, 16);
printf("Tree 2: ");
inorder(root2);
printf("\n");
// 合并两颗二叉搜索树并输出
struct TreeNode* merged_tree = mergeTrees(root1, root2);
printf("Merged tree: ");
inorder(merged_tree);
printf("\n");
return 0;
}
```
代码思路:
1. 定义结构体`TreeNode`表示二叉树节点,包括它的值`val`和指向左右子节点的指针`left`和`right`。
2. 定义插入函数`insert`,将给定的值插入到二叉搜索树中的合适位置。
3. 定义中序遍历输出函数`inorder`,按照顺序遍历二叉树,并输出每个节点的值。
4. 定义合并函数`mergeTrees`,将两颗二叉搜索树合并成一颗,具体实现是递归地将两个树的节点值相加,插入到新建的节点中,然后递归合并左右子节点。
5. 在`main`函数中创建两颗二叉搜索树,分别为其插入不同的值,然后调用合并函数`mergeTrees`,合并这两颗树,并输出合并后生成的树的中序遍历结果。
时间复杂度:以上合并两颗二叉搜索树的算法的时间复杂度为O(n+m),其中n和m分别是两个树的节点个数。由于使用了递归,因此空间复杂度也是O(n+m)。
阅读全文