二叉搜索树的实现
来源:互联网 发布:苹果手机数据恢复软件 编辑:程序博客网 时间: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=¤t->left; else{ assert(value!=current->value); link=¤t->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 ¤t->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;}