二叉树的递归创建 、以及二叉查找树查找的建立 和遍历查找的比较
(1)二叉树的递归创建和二叉树的数组表示法非常相似,可参考二叉树的数组创建
(2)二叉查找树的特性
1)每一个结点的值都不相同,也就是说整棵树中的每一个结点都拥有不同的值。
2)每一个结点的数据大于左子树结点,但是小于右子树结点。
3)左、右两部分的子树,也是一颗二叉查找树。
和遍历查找相比,遍历查找需要查找左右两颗子树,而二叉查找树只需要查找左右子树的某个子树都可以。
下面是二叉查找树的实现过程,为了便于比较,顺便也附上了遍历查找的代码。
#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;
int data[16] ={0,5,4,6,2,0,0,8,1,3,0,0,0,0,7,9};
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 ;
}