C语言/C++常见习题问答集锦(六十八) 之二叉搜索树揭秘
程序之美
题目描述
输入一组整数,建立一个二叉搜索树(二叉排序树,二叉查找树)。
要求:递归方式
分析:
二叉搜索树(BST)又称二叉查找树或二叉排序树。一棵二叉搜索树是以二叉树来组织的,可以使用一个链表数据结构来表示,其中每一个结点就是一个对象。一般地,除了key和位置数据之外,每个结点还包含属性lchild、rchild和parent,分别指向结点的左孩子、右孩子和双亲(父结点)。如果某个孩子结点或父结点不存在,则相应属性的值为空(NIL)。根结点是树中唯一父指针为NULL的结点,而叶子结点的孩子结点指针也为NULL。
核心代码:
#include<stdio.h>
#include<stdlib.h>
struct tree
{
int data;
struct tree *left;
struct tree *right;
};
typedef struct tree treenode;
typedef treenode *btree;
btree creatbtree( int *data,int pos )
{
btree newnode;
if(data[pos] == 0|| pos > 15 )
return NULL;
else
{
newnode = (btree)malloc(sizeof(treenode));
newnode->data = data[pos];
newnode->left = creatbtree(data,2*pos);
newnode->right = creatbtree(data,2*pos+1);
return newnode;
}
}
btree btreefind(btree ptr,int value)
{
while( ptr != NULL )
{
if( ptr->data == value )
{
return ptr;
}
else
if ( ptr->data > value)
ptr = ptr->left;
else
ptr = ptr->right;
}
}
btree btreesearch(btree ptr,int value)
{
btree ptr1,ptr2;
if( ptr != NULL )
{
if ( ptr->data == value)
return ptr ;
else
ptr1 = btreesearch(ptr->left,value);
ptr2= btreesearch(ptr->right,value);
if( ptr1 != NULL)
return ptr2;
else
return NULL;
}
else
return NULL;
}
int main()
{
btree root = NULL;
btree ptr = NULL;
int value,n, i;
int data[512];
printf("请输入数据个数:\n");
scanf("%d", &n);
if(n <= 0){
return -1;
}
printf("请输入数据:\n");
for(i = 0; i < n; i ++){
scanf("%d",&data[i]);
}
root = creatbtree(data,1);
printf("请输入寻找结点数据(1 —— 9)\n");
scanf("%d",&value);
ptr = btreefind(root,value);
if( ptr != NULL )
printf("二叉查找树:结点数据是 %d\n",ptr->data);
else
printf("二叉查找树没有找到\n");
ptr = btreesearch(root,value);
if( ptr != NULL )
printf("遍历查找:结点数据是 %d\n",ptr->data);
else
printf("二叉查找树没有找到\n");
return 0 ;
}