二叉搜索树的实现

来源:互联网 发布:苹果手机数据恢复软件 编辑:程序博客网 时间:2024/06/08 04:35
//链式二叉搜索树#include<stdio.h>#include<stdlib.h>#include<assert.h>#define tree_type inttypedef struct tree_list{      struct tree_list *left;      struct tree_list *right;      tree_type value;}tree_list;static tree_list *tree=NULL;void insert(tree_type value){   tree_list *current;   tree_list **link;   link=&tree;   while((current=*link)!=NULL)   {      if(value<current->value)         link=&current->left;      else{         assert(value!=current->value);         link=&current->right;      }   }   current=(tree_list *)malloc(sizeof(tree_list));   assert(current!=NULL);   current->value=value;   current->left=NULL;   current->right=NULL;   *link=current;}int find(tree_type value){   tree_list *current;   current=tree;   while(current!=NULL &current->value!=value)   {      if(value<current->value)         current=current->left;      else         current=current->right;   }   if(current!=NULL)      return 1;   else      return 0;}//前序遍历void pre_order_traverse(tree_list * tree){   if(tree!=NULL)   {      printf("%d",tree->value);      pre_order_traverse(tree->left);      pre_order_traverse(tree->right);   }}int main(){   insert(5);   insert(3);   insert(6);   insert(2);   insert(1);   insert(4);  //printf("%d",find(6));   pre_order_traverse(tree);   printf("\n%d",find(7));   return 0;}//数组形式的二叉搜索树,数组元素值为0的时候表明此时无元素#include<stdio.h>#include<assert.h>#define tree_typeint#define tree_size100#define array_size(tree_size+1)static tree_type tree[array_size];//节点N的双亲节点是N/2//节点N的左孩子是节点2N//节点N的右孩子是节点2N+1static int left_child(int current){   return current*2;}static int right_child(int current){   return current*2+1;}void insert(tree_type value){   int current;   assert(value!=0);//确保为非0,用零提示一个未使用的节点   current=1;   while(tree[current]!=0)   {      if(value<tree[current])         current=left_child(current);      else{         assert(value!=tree[current]);         current=right_child(current);      }      assert(current<array_size);   }   tree[current]=value;}tree_typefind(tree_type value){   int current=1;   while(current<array_size &&tree[current]!=value)   {      if(value<tree[current])         current=left_child(current);      else         current=right_child(current);   }   if(current<array_size)      return current;   else      return 0;}//前序遍历void pre_order_traverse(int current){   if(current<array_size &&tree[current]!=0)   {      printf("%d",tree[current]);      pre_order_traverse(left_child(current));      pre_order_traverse(right_child(current));   }}//中序遍历void in_order_traverse(int current){   if(current<array_size &&tree[current]!=0)   {      in_order_traverse(left_child(current));      printf("%d",tree[current]);      in_order_traverse(right_child(current));   }}//后序遍历void post_order_traverse(intcurrent){   if(current<array_size &&tree[current]!=0)   {      post_order_traverse(left_child(current));      post_order_traverse(right_child(current));      printf("%d",tree[current]);   }}int main(){   insert(5);   insert(3);   insert(6);   insert(2);   insert(1);   insert(4);  //printf("%d",find(6));   pre_order_traverse(1);   printf("\n");   in_order_traverse(1);   printf("\n");   post_order_traverse(1);   return 0;}