一道C数据结构试题

2024-12-22 11:40:25
推荐回答(3个)
回答1:

楼主已经说明是“二叉排序树”,所以不需要经过遍历了,因为在创建排序树时已经是有顺序了。
所以这棵树最左边叶子节点的值肯定就是最小,最右边叶子节点的值肯定就是最大。
按照题目应该只给出查找的算法就可以,不过为了验证整个程序,把创建二叉排序树和查找最大最小的完整程序放在下面。
另因为是测试,链表释放比较麻烦,就没有做,有memleak,凑活着看吧,赫赫。

#include
#include

typedef struct _my_tree_t {
struct _my_tree_t *lchild;
struct _my_tree_t *rchild;

int data;
} my_tree_t;

/* 在二叉排序树中插入key节点 */
my_tree_t *insert_bst(my_tree_t *t, int key)
{
if (t == NULL) {
t = (my_tree_t *)malloc(sizeof(my_tree_t));
t->lchild = t->rchild = NULL;
t->data = key;

} else {
if (key < t->data)
t->lchild = insert_bst(t->lchild, key);
else
t->rchild = insert_bst(t->rchild, key);
}

return t;

}

/* 创建n个节点的二叉排序树,tree为根结点 */
my_tree_t *create_bitree(my_tree_t *tree, int *d, int n)
{
tree = NULL;

int i;
for (i=0; i tree = insert_bst(tree, *(d+i));

return tree;
}

/* 查找最小节点,这就是楼主要求的东西 */
int search_min(my_tree_t *t)
{
if (NULL == t){
goto nofound;
}

my_tree_t *p = t;

while (p->lchild != NULL)
p = p->lchild;

return p->data;

nofound:
return -1;
}

/* 查找最大节点,这是楼主要求的第二个东西 */
int search_max(my_tree_t *t)
{
if (NULL == t){
goto nofound;
}

my_tree_t *p = t;

while (p->rchild != NULL)
p = p->rchild;

return p->data;

nofound:
return -1;
}

int main()
{
int num = 0, *data = NULL;
my_tree_t *t;
printf("create tree, input digtal:\nnumber:\n");

scanf("%d", &num);

data = (int *)malloc(num*sizeof(int));

int i;
for (i=0; i scanf("%d", data+i);
}

t = create_bitree(t, data, num);

printf("min:%d, max: %d\n", search_min(t), search_max(t));

if (data != NULL)
free(data);

return 0;
}

回答2:

遍历这棵树,用先序,后序,中序都行.
用两个变量:一个记录最大值MAX,开始时候赋初始值为0,另一个记录最小值MIN,赋初值为65535(或其它比较大的数).
比较每个结点所存的整数与这两个值的大小.若结点的值>MAX,则MAX=结点的值.若结点的值小于MIN,则MIN=结点的值.

回答3:

void findm(bitree T)
{
int min,max;
bitree p;
p=T;
while(p->lchild)p=p->lchild;
min=p->data;
p=T;
while(p->rchild)p=p->rchild;
max=p->data;
printf("最大整数为%d,最小整数为%d\n",max,min);
}