题目:将两棵二叉排序树合并为一棵二叉排序树。
这一题我的思路是,遍历第二棵二叉排序树,将元素依次插入第一棵二叉排序树中,这样思路较为简明,易于理解。
完成代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *lchild;
struct node *rchild;
} bstnode, *bstree;
void createbstree(bstree *t);
void insertbstree(bstree *t, int k);
void mergebstree(bstree *t, bstree t2);
void output(bstree t);
int main()
{
bstree t1, t2;
createbstree(&t1);
createbstree(&t2);
mergebstree(&t1, t2);
output(t1);
return 0;
}
void createbstree(bstree *t)
{
int k;
scanf("%d", &k);
if(k == -1)
{
*t = NULL;
}
else
{
*t = (bstree)malloc(sizeof(bstnode));
(*t)->data = k;
createbstree(&((*t)->lchild));
createbstree(&((*t)->rchild));
}
}
void mergebstree(bstree *t, bstree t2)
{
bstree p;
p = t2;
if(p != NULL)
{
insertbstree(t, p->data);
mergebstree(t, p->lchild);
mergebstree(t, p->rchild);
}
}
void insertbstree(bstree *t, int k)
{
bstree p;
if(*t == NULL)
{
p = (bstree)malloc(sizeof(bstnode));
p->data = k;
p->lchild = p->rchild = NULL;
*t = p;
}
else if((*t)->data < k)
{
insertbstree(&((*t)->rchild), k);
}
else
{
insertbstree(&((*t)->lchild), k);
}
}
void output(bstree t)
{
if(t != NULL)
{
output(t->lchild);
printf("%d ", t->data);
output(t->rchild);
}
}
这是数据结构理论NOJ的最后一题了,回望这学期,最初链表都不会,现在也算能勉强实现二叉排序树。虽然与大佬相比,依然难以望其项背,但至少对我个人来说有了很大的进步,也终于是略有一点儿“编程”而非“编码”的感觉了。或许相较于代码的具体实现,更重要的是这种数据结构的思维吧。