二叉搜索树
来源:互联网 发布:php怎样保持登录状态 编辑:程序博客网 时间:2024/06/05 16:11
二叉搜索树定义:
一棵二叉树,可以为空;如果不为空,满足以下性质:
1. 非空左子树的所有键值小于其根结点的键值。
2. 非空右子树的所有键值大于其根结点的键值。
3. 左、右子树都是二叉搜索树。
二叉搜索树对应的是二分查找
二叉搜索树的查找、插入和删除:
二叉搜索树的查找可以用递归或者循环,对应于二分查找,复杂度为O(logN)。二叉搜索树最小值在最左边,最大值在最右边。
二叉搜索树的插入删除用递归,复杂度同样为O(logN)。
也就是二叉搜索树的基本操作复杂度均是树的深度。
//二叉搜索树的查找(尾递归)尾递归都可以转换为循环的形式Position Find( ElementType X, BinTree BST ){ if( !BST ) return NULL; /*查找失败*/ if( X > BST->Data ) return Find( X, BST->Right ); /*在右子树中继续查找*/ else if( X < BST->Data ) return Find( X, BST->Left ); /*在左子树中继续查找*/ else /* X == BST->Data */ return BST; /*查找成功, 返回结点的找到结点的地址*/}//二叉搜索树的查找(循环)Position IterFind( ElementType X, BinTree BST ){ while( BST ) { if( X > BST->Data ) BST = BST->Right; /*向右子树中移动, 继续查找*/ else if( X < BST->Data ) BST = BST->Left; /*向左子树中移动, 继续查找*/ else /* X == BST->Data */ return BST; /*查找成功, 返回结点的找到结点的地址*/ }return NULL; /*查找失败*/}//二叉搜索树的查找最小元素Position FindMin( BinTree BST ){ if( !BST ) return NULL; /*空的二叉搜索树,返回NULL*/ else if( !BST->Left ) return BST; /*找到最左叶结点并返回*/ else return FindMin( BST->Left ); /*沿左分支继续查找*/}//二叉搜索树的查找最大元素Position FindMax( BinTree BST ){ if(BST ) while( BST->Right ) BST = BST->Right; /*沿右分支继续查找,直到最右叶结点*/ return BST;}//二叉搜索树的插入BinTree Insert( BinTree BST, ElementType X ){ if( !BST ){ /* 若原树为空,生成并返回一个结点的二叉搜索树 */ BST = (BinTree)malloc(sizeof(struct TNode)); BST->Data = X; BST->Left = BST->Right = NULL; } else { /* 开始找要插入元素的位置 */ if( X < BST->Data ) BST->Left = Insert( BST->Left, X ); /*递归插入左子树*/ else if( X > BST->Data ) BST->Right = Insert( BST->Right, X ); /*递归插入右子树*/ /* else X已经存在,什么都不做 */ } return BST;}//二叉搜索树的删除 BinTree Delete( BinTree BST, ElementType X ) { Position Tmp; if( !BST ) printf("要删除的元素未找到"); else { if( X < BST->Data ) BST->Left = Delete( BST->Left, X ); /* 从左子树递归删除 */ else if( X > BST->Data ) BST->Right = Delete( BST->Right, X ); /* 从右子树递归删除 */ else { /* BST就是要删除的结点 */ /* 如果被删除结点有左右两个子结点 */ if( BST->Left && BST->Right ) { /* 从右子树中找最小的元素填充删除结点 */ Tmp = FindMin( BST->Right ); BST->Data = Tmp->Data; /* 从右子树中删除最小元素 */ BST->Right = Delete( BST->Right, BST->Data ); } else { /* 被删除结点有一个或无子结点 */ Tmp = BST; if( !BST->Left ) /* 只有右孩子或无子结点 */ BST = BST->Right; else /* 只有左孩子 */ BST = BST->Left; free( Tmp ); } } } return BST;}
阅读全文
0 0
- 【二叉搜索数】HDU3791二叉搜索树
- 二叉树--二叉搜索树
- 【二叉树】二叉搜索树
- 二叉树- 二叉搜索树
- 【搜索树】二叉搜索树
- 二叉搜索树BSTree
- 二叉搜索树
- 二叉搜索树
- 二叉搜索树
- 最优二叉搜索树
- 二叉搜索树
- 二叉搜索树
- HDOJ3791 二叉搜索树
- 二叉查找树搜索
- 二叉搜索树
- 二叉搜索树
- BST 二叉搜索树
- 二叉搜索树
- 一起学ROS之启动文件及ROS命令汇总
- Linux虚拟机安装Redis
- js
- 百练_2675:计算书费
- android 系统数据业务---关闭
- 二叉搜索树
- AI十大高危行业
- Android greenDao 初识运用
- QT PC Tool
- x264源代码简单分析:宏块分析(Analysis)部分-帧内宏块(Intra)
- AI发展受影响的高危岗位
- python + webdriver
- 器——Eclipse开发JAVA中如何Debug
- datasnap回调演示