二叉查找树 ADT实现
来源:互联网 发布:python for 重试 编辑:程序博客网 时间:2024/06/07 12:23
1.定义:什么是二叉查找树
对于树中的每个节点X,它的左子树中所有关键字值小于X的关键字值,而它的右子树中所有关键字值大于X的关键字值。这意味着该树所有的元素可以用某种统一的方式排序。
2.实现:这里假设运算符"<" ">" "="都可以用于树中的元素。
2.1MakeEmpty --初始化操作方法;
struct TreeNode;typedef struct TreeNode *Position;typedef struct TreeNode *SearchTree;SearchTree MakeEmpty( SearchTree T );Position Find( ElementType X, SearchTree T );Position FindMin( SearchTree T );Position FindMax( SearchTree T );SearchTree Insert( ElementType X, SearchTree T );SearchTree Delete( ElementType X, SearchTree T );ElemenType Retrieve( Position P );struct TreeNode{ ElementType Element; SearchTree Left; SearchTree Right;};
SearchTreeMakeEmpty( SearchTree T){ if( T != NULL) { MakeEmpty( T->Left ); MakeEmpty( T->Right ); free( T ); } return NULL;}
2.2 Find方法: 如果在树T中查找到具有关键字X的节点,则返回该节点指针,否则返回NULL;
PositionFind( ElementType X, SearchTree T ){ if( T == NULL ) return NULL; if( X < T->Element ) return Find( X, T->Left ); else if( X > T->Element ) return Find( X, T->Right ); else return T;}
2.3 FindMin与FindMax方法:只需要向左与向右找到终止点就是最小值与最大值;
PositionFindMin( SearchTree T ){ if( T == NULL ) return NULL; else if( T->Left == NULL ) return T; else return FindMin( T->Left );}//非递归实现FindMaxPositionFindMax( SearchTree T ){ if( T != NULL ) while( T->Right != NULL ) T= T->Right; return T;}
2.4 Insert方法
SearchTreeInsert( ElementType X, SearchTree T ){ if( T == NULL ) { T = malloc( sizeof( struct TreeNode )); if( T == NULL ) FatalError("out of space!!!"); else { T->Element = X; T->Left = T->Right = NULL; } } else if( X < T->Element ) T->Left = Insert( X, T->Left ); else if((X > T->Element ) T->Right = Insert(X, T->Right ); return T;}
2.5 Delete方法
删除时需要考虑几种情况,而且比较复杂;
1.当删除节点是叶子节点时,立即删除即可;
2.当删除节点有一个儿子节点时,把儿子节点代替该节点的位置,然后删除该节点;
3.当删除节点有两个儿子节点时,一般的删除策略是用其右子树的最小的数据代替该节点
的数据并递归删除那个节点(现在它是空的);因为右子树的最小节点不可能有左儿子,所以第二次Delete要容易。
SearchTreeDelete( ElementType X, SearchTree T ){ Position TmpCell; if( T == NULL ) Error("Element not found."); else if( X < T->Element ) T->Left = Delete( X, T->Left ); else if( X > T->Element ) T->Right = Delete( X, T->Right ); else if( T->Left && T->Right ) //两个儿子节点的情况 { TmpCell = FindMin( T->Right ); T->Element = TmpCell->Element; T->Right = Delete( T->Element, T->Right ); } esle //一个儿子节点的情况 { TmpCell = T; if( T->Left == NULL ) T = T->Right; else if( T->Right == NULL ) T = T->Left; } return T;}
- 二叉查找树 ADT实现
- 二叉查找树 ADT
- ADT 二叉查找树
- ADT 二叉查找树
- 查找树ADT-二叉查找树
- 查找树ADT之二叉查找树
- 查找树ADT--二叉查找树
- 查找树ADT--二叉查找树
- JAVA之查找二叉树ADT
- 二叉树 ADT 的实现
- 二叉查找树实现
- 二叉查找树实现
- 二叉查找树实现
- 二叉查找树实现
- 二叉树的简介以及ADT实现
- ADT之二叉树代码实现
- 数据结构-->二叉树的链式实现 ADT
- 数据结构(scheme) -- 抽象数据类型(ADT) -- 二叉查找树
- Visual Studio 2008 常见错误解决 之 预编译头
- ie 下 javascript调试工具汇总
- WireShark 过滤语法
- 谈iPhone和iPad开发中的图标设置
- lucene中QueryParser的使用查询示例
- 二叉查找树 ADT实现
- wsdl2java命令
- android SDK 环境搭建 离线
- Microsoft®Office Project Professional 2007 中文试用版的密钥
- JNI基本数据类型转换
- Android 模拟器中添加应用程序 和 删除应用程序
- Sql Server导入导出Excel
- 如何实现在线人数统计和登录限制?
- JqPlot增加Click事件