算法 操作二叉查找树
来源:互联网 发布:零件加工报价软件 编辑:程序博客网 时间: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
- 算法 操作二叉查找树
- 【算法导论】二叉查找树的操作C++实现
- 二叉查找树——删除操作(算法导论)
- 数据结构与算法简记:二叉查找树相关操作
- 查找算法 顺序查找 二分查找 二叉树查找 算法
- 二叉查找树删除操作
- 二叉查找树的操作
- 二叉查找树的操作
- 二叉查找树其他操作
- 查找二叉树的操作
- 二叉查找树基本操作
- 二叉查找树的操作
- 算法之二叉查找树
- 算法学习--二叉查找树
- 算法导论 二叉查找树
- 二叉树的查找算法
- 算法-二叉查找树
- 算法3.8查找二叉树
- 双色球随机生成
- 微信小程序之自定义轮播图实例 —— 微信小程序实战系列(3)
- Java中的参数传递方式
- 【OpenCV】笔记(8)——几何变换/修复/去噪
- vue.js树形组件详解,删除双击增加分支
- 算法 操作二叉查找树
- 【Linux】守护进程概述&cron守护进程实现定时任务
- AI与CV公司
- C++实验3
- web前端-在迷惘中的探索HTML5(二)本地存储之IndexDB
- Windbg在软件调试中的应用
- nodejs-fs模块
- 从零开始编译自己的 Linux 发行版
- jQuery使用说明