算法 操作二叉查找树

来源:互联网 发布:零件加工报价软件 编辑:程序博客网 时间:2024/06/07 08:52

参考《数据结构与算法分析


二叉查找树的建立:

typedef struct binary_tree_{int data;struct binary_tree_ *left;struct binary_tree_ *right;}binary_tree;  //这里binary_tree = struct binary_tree_

二叉查找树创建一个根节点:

binary_tree* create_tree(int data)  //创建一个根节点 {binary_tree* root=NULL;root=(binary_tree*)malloc(sizeof(struct binary_tree_));root->data=data;root->left=NULL;root->right=NULL; return root;} 

 

二叉查找树的查找:

binary_tree* find(int data,binary_tree *T)  //二叉查找树的查找 {if(T==NULL)return NULL;if(data<T->data)return find(data,T->left);if(data>T->data)return find(data,T->right);if(data==T->data)return T;} 

二叉查找树寻找最小值递归实现:

binary_tree* findmin1(binary_tree *T)  //不断向左找,找到最左端,递归实现 {if(T==NULL)return NULL;if(T->left==NULL)return T;if(T->left!=NULL)return findmin1(T->left);}

二叉查找树寻找最小值递归实现:

binary_tree* findmin2(binary_tree *T)  //不断向左找,找到最左端,非递归实现 {if(T!=NULL)while(T->left!=NULL)T=T->left;return T;}

二叉查找树的插入:

binary_tree* insert(int data,binary_tree *T)   //二叉查找树的插入,返回的还是根节点 {if(T==NULL)   //找到一个空位 {T=(binary_tree*)malloc(sizeof(struct binary_tree_));T->data=data;T->left=NULL;T->right=NULL;}else if(data<T->data)T->left=insert(data,T->left);   //向左继续搜索 else if(data>T->data)T->right=insert(data,T->right);  //向右搜索 return T;}


二叉查找树的删除:

binary_tree* del(int data,binary_tree *T)   //二叉查找树的删除 {binary_tree *temp;if(data<T->data)T->left=del(data,T->left);else if(data>T->data)T->right=del(data,T->right);else if(T->left!=NULL && T->right!=NULL)  //两个子树 {temp=findmin1(T->right);T->data=temp->data;T->right=del(T->data,T->right); }else //一个或者没有子树 {temp=T;if(T->left==NULL) //右子树或有或没有T=T->right;else if(T->right==NULL)  //左子树一定有 T=T->left;free(temp);}return T;} 
在删除代码中,有几个定理便于帮助理解:

若左子树非空,则左子树上所有结点的值均小于它的根节点的值。

子树非空,则子树上所有结点的值均于它的根节点的值。

根据这两条定理,找到待删除的结点后,将它的右子树结点们的最小值和待删除结点的值进行替换,然后继续向下搜索,寻找刚才替换的值,直到到达末端。


下面进行一下测试

int main(void){binary_tree *root;binary_tree *root1;root=create_tree(3);root=insert(2,root);root=insert(4,root);root1=findmin1(root);root=del(3,root);printf("%d",root->data);printf("%d",root1->data);return 0;} 
函数都可以运行正确。

1 0
原创粉丝点击