楼主已经说明是“二叉排序树”,所以不需要经过遍历了,因为在创建排序树时已经是有顺序了。
所以这棵树最左边叶子节点的值肯定就是最小,最右边叶子节点的值肯定就是最大。
按照题目应该只给出查找的算法就可以,不过为了验证整个程序,把创建二叉排序树和查找最大最小的完整程序放在下面。
另因为是测试,链表释放比较麻烦,就没有做,有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
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
}
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;
}
遍历这棵树,用先序,后序,中序都行.
用两个变量:一个记录最大值MAX,开始时候赋初始值为0,另一个记录最小值MIN,赋初值为65535(或其它比较大的数).
比较每个结点所存的整数与这两个值的大小.若结点的值>MAX,则MAX=结点的值.若结点的值小于MIN,则MIN=结点的值.
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);
}