- 浏览: 2949185 次
- 性别:
- 来自: 上海
文章分类
- 全部博客 (2529)
- finance (1459)
- technology (218)
- life (343)
- play (150)
- technology-component (0)
- idea (6)
- house (74)
- health (75)
- work (32)
- joke (23)
- blog (1)
- amazing (13)
- important (22)
- study (13)
- Alternative (0)
- funny (8)
- stock_technology (12)
- business (16)
- car (21)
- decorate (4)
- basketball (2)
- English (16)
- banker (1)
- TheBest (1)
- sample (2)
- love (13)
- management (4)
最新评论
-
zhongmin2012:
BSM确实需要实践,标准ITIL服务流程支持,要做好,需要花费 ...
BSM实施之前做什么 -
shw340518:
提示楼主,有时间逻辑bug:是你妈二十那年写的 那会儿连你爹都 ...
80后辣妈给未来儿子的信~我的儿,你也给我记住了~~~ -
guoapeng:
有相关的文档吗?
it项目管理表格(包含146个DOC文档模板) -
solomon:
看到的都是 这种 CTRL+C 和 CTRL+V 的文章, ...
Designing a website with InfoGlue components -
wendal:
恩, 不错. 有参考价值
Designing a website with InfoGlue components
二叉检索树
Copyright 2002 by Zhang Ming, PKUCS
1. 定义及性质
n二叉检索树或者是一颗空树;或者是具
有下列性质的二叉树:对于任何一个结
点,设其值为K,则该结点的左子树(若
不空)的任意一个结点的值都小于K;该
结点的右子树(若不空)的任意一个结点
的值都大于或等于K;而且它的左右子树
也分别为二叉检索树.
n二叉检索树的性质: 按照中序周游将各结
点打印出来,将得到按照由小到大的排
列.
Copyright 2002 by Zhang Ming, PKUCS
BST图示
Copyright 2002 by Zhang Ming, PKUCS
检索
n二叉检索树的效率就在于只需检索二个子树
之一.
-从根结点开始,在二叉检索树中检索值K.如果
根结点储存的值为K,则检索结束.
-如果K小于根结点的值,则只需检索左子树
-如果K大于根结点的值,就只检索右子树
n这个过程一直持续到K被找到或者我们遇上
了一个树叶.
n如果遇上树叶仍没有发现K,那么K就不在该
二叉检索树中.
Copyright 2002 by Zhang Ming, PKUCS
2. 二叉检索树类定义
// BSTimplementation for the Dictionary ADT
template
class BST : public Dictionary {
private:
BinNode* root; // Root of the BST
intnodecount; // Number of nodes in the BST
// Private "helper" functions
void clearhelp(BinNode*);
BinNode* inserthelp(BinNode*, const Elem&);
BinNode* deletemin(BinNode*,
BinNode*&);
BinNode* removehelp(BinNode*, const Key&,
BinNode*&);
boolfindhelp(BinNode*, const Key&, Elem&) const;
void printhelp(BinNode*, int) const;
Copyright 2002 by Zhang Ming, PKUCS
public:
BST() { root = NULL; nodecount= 0; } // Constructor
~BST() { clearhelp(root); } // Destructor
void clear()
{ clearhelp(root); root = NULL; nodecount= 0; }
boolinsert(constElem& e) {
root = inserthelp(root, e);
nodecount++; return true;
}
boolremove(constKey& K, Elem& e) {
BinNode* t = NULL;
root = removehelp(root, K, t);
if (t == NULL) return false; // Nothing found
e = t->val(); nodecount--;
delete t;
return true;
}
Copyright 2002 by Zhang Ming, PKUCS
boolremoveAny(Elem& e) { // Delete min value
if (root == NULL) return false; // Empty tree
BinNode* t;
root = deletemin(root, t);
e = t->val();
delete t;
nodecount--;
return true;
}
boolfind(constKey& K, Elem& e) const
{ return findhelp(root, K, e); }
intsize() { return nodecount; }
void print() const {
if (root == NULL) cout<< "The BST is empty.\n";
else printhelp(root, 0);
}
};
Copyright 2002 by Zhang Ming, PKUCS
3. 二叉检索树的实现
n插入中包含检索(可以重码)
boolinsert(constElem& e) {
root = inserthelp(root, e);
nodecount++; return true;
}
nInserthelp的实现
template
BinNode* BST::
inserthelp(BinNode* subroot, const Elem& val) {
if (subroot== NULL) // Empty tree: create node
return (new BinNodePtr(val, NULL, NULL));
if (EEComp::lt(val, subroot->val())) // Insert on left
subroot->setLeft(inserthelp(subroot->left(), val));
else subroot->setRight(inserthelp(subroot->right(), val));
return subroot; // Return subtreewith node inserted
}
Copyright 2002 by Zhang Ming, PKUCS
BST插入图示
Copyright 2002 by Zhang Ming, PKUCS
检索
template
boolBST:: findhelp(
BinNode* subroot, const Key& K, Elem&
e) const {
if (subroot== NULL) return false; // Empty tree
else if (KEComp::lt(K, subroot->val())) // Check left
return findhelp(subroot->left(), K, e);
else if (KEComp::gt(K, subroot->val())) //Check right
return findhelp(subroot->right(), K, e);
else { e = subroot->val(); return true; } // Found it
}
Copyright 2002 by Zhang Ming, PKUCS
打印
template
void BST::
printhelp(BinNode* subroot, intlevel) const {
if (subroot== NULL) return; // Empty tree
printhelp(subroot->left(), level+1); //Do left subtree
for (inti=0; icout<< " ";
cout}
Copyright 2002 by Zhang Ming, PKUCS
4. 二叉检索树结点的删除
n对于二叉检索树,删除一个结点,相当
于删除有序序列中的一个记录,要求删
除后能保持二叉检索树的排序特性,并
且树高变化较小.
(1)找到值为val的结点rt
(2)rt为叶,可以直接删除
(3)rt左空或右空,可以让它的右子树或
左子树直接代替原rt
(4)rt左右都不空,可以让右子树中的最
小值代替原rt
Copyright 2002 by Zhang Ming, PKUCS
删除子树中最小值图示
Copyright 2002 by Zhang Ming, PKUCS
删除右子树中最小值结点
Copyright 2002 by Zhang Ming, PKUCS
删除rt子树中最小结点
template
BinNode* BST::
deletemin(BinNode* subroot,
BinNode*& min) {
if (subroot->left() == NULL) { // Found min
min = subroot;
return subroot->right();
}
else { // Continue left
subroot->setLeft(deletemin(subroot->left(), min));
return subroot;
}
}
Copyright 2002 by Zhang Ming, PKUCS
删除值为val的结点
template
BinNode* BST::
removehelp(BinNode* subroot, const Key& K,
BinNode*& t) {
if (subroot== NULL) return NULL; // Val is not in tree
else if (KEComp::lt(K, subroot->val())) // Check left
subroot->setLeft(removehelp(subroot->left(), K, t));
else if (KEComp::gt(K, subroot->val())) // Check right
subroot->setRight(removehelp(subroot->right(), K, t));
else { // Found it: remove it
BinNode* temp;
t = subroot;
Copyright 2002 by Zhang Ming, PKUCS
if (subroot->left() == NULL) // Only a right child
subroot= subroot->right(); // so point to right
else if (subroot->right() == NULL) // Only a left child
subroot= subroot->left(); // so point to left
else { // Both children are non-empty
subroot->setRight(deletemin(subroot->right(), temp));
Elemte= subroot->val();
subroot->setVal(temp->val());
temp->setVal(te);
t = temp;
}
}
return subroot;
}
Copyright 2002 by Zhang Ming, PKUCS
删除值为val的结点(续)
else { // Found it: remove it
BinNode* temp = rt;
if (rt->left == NULL)
rt= rt->right;
else if (rt->right == NULL)
rt= rt->left;
else {
temp = deletemin(rt->right);
rt->setValue(temp->value()); }
delete temp;
} }
Copyright 2002 by Zhang Ming, PKUCS
讨论
n所有操作都围绕BST的性质,并一定要保
持这个性质
n用非递归算法实现插入,检索,删除
Copyright 2002 by Zhang Ming, PKUCS
讨论(续)
n允许有重复关键码
时(右子树)
-重复关键码应该有
规律地出现
-插入,检索,删除
都考虑这个特点.
尤其是删除,必须
删右子树中最小(
如果有重复,将是
值与被删根结点相
同的结点,因此能
保持性质)
发表评论
-
New Enterprise Security Solutions
2011-09-13 15:46 0<!-- [if !mso]> <styl ... -
ES Announces Enterprise Security Solutions
2011-09-13 15:40 0<!-- [if !mso]> <styl ... -
linux下如何将文件打包、压缩并分割成制定大小?
2010-09-15 18:52 3310将大文件或目录打包、 ... -
rhel4 yum安装, 使用
2010-09-07 16:37 0第一种方法: yum源来自chinalinuxpub.com ... -
Windows: 远程自动安装程序
2010-08-26 15:48 1083问题的提出 作为 ... -
Oracle体系结构
2010-08-07 09:53 1023Oracle体系结构 Oracle Server包括Oracl ... -
ocp sesson 3
2010-07-31 14:39 0show parameter undo 只有 默认情况下服务 ... -
ocp session 2
2010-07-25 17:00 0/home/oracle/raInventory/orains ... -
ocp session 1
2010-07-24 13:02 0ocp first lesson D:\oracle_cou ... -
Python的xmlrpc调试
2010-07-19 23:55 2107Python的xmlrpc 调 试 ----------- ... -
mdadm使用详解及RAID 5简单分析
2010-07-11 16:19 1390http://blog.csdn.net/chinalinux ... -
Linux的lvm的基本配置步骤
2010-07-11 14:53 12831.增加硬件 增加的ide硬盘前缀为hd,scs ... -
OCP study material
2010-07-11 13:52 0\\192.168.1.105watch -n 1 'stat ... -
apache+python+mod_python+django 编译安装指南
2010-06-24 17:25 14691、本文将知道你在 linux 下使用源码包安装 ... -
在ubuntu下配置apache运行python脚本
2010-06-22 16:11 2269常用的简单命令 sudo apt ... -
Python 2.5 Quick Reference
2010-06-21 11:18 1463... -
shell 面试题汇集
2010-06-10 19:50 1043利用 top 取某个进程的 CPU 的脚本 : ... -
shell程序面试题
2010-06-10 19:48 29001.要求分析Apache访问日志,找出里面数量在前面100位的 ... -
EMC技术支持工程师笔试部分试题回忆
2010-06-07 15:16 1648要查看更多EMC公司笔经相关信息,请访问EMC公司校园招聘CL ... -
linux shell 条件语句
2010-06-03 23:29 1777...
相关推荐
设计一个算法程序,使得该程序从二叉检索树中删除一个结点,并仍然保持二叉检索树的特性不变 实验要求: 创建一棵二叉检索树,然后用中序遍历查找要删除的结点的后继结点
### 最优二叉检索树(Optimal Binary Search Tree) #### 概述 最优二叉检索树(Optimal Binary Search Tree, OBST),是一种特殊的二叉树结构,它旨在通过优化节点布局来降低查找数据时所需的平均成本。在构建...
### 二叉检索树C语言版知识点解析 #### 一、二叉检索树简介 二叉检索树(Binary Search Tree, BST),又称有序或排序二叉树,是一种特殊的二叉树数据结构,其中每个节点具有以下特性: - 节点包含一个键(Key)以及...
二叉检索树与最大堆的实现代码及验证 验证题目: 1、编写一个能够统计输入文本中所出现的每个单词的词频。 输入:一个文本文件 输出:按照字典顺序将输入文本中出现的单词以及相应的词频排序输出结果 2、重新...
二叉检索树 c++数据结构 对应于数据机构与算法分析(c++版)第三版或第二版 Clifford A.Shaffer 重庆大学使用教材
在本实验中,我们将深入探讨图论和二叉检索树的相关概念。首先,我们要理解图的最小生成树,这是图论中的一个重要概念。最小生成树是指在一个加权无向图中,连接所有顶点的树形结构,其边的权重之和最小。Prim算法和...
### 二叉检索树C++实现关键知识点解析 #### 一、二叉检索树简介 二叉检索树(Binary Search Tree, BST),又称有序或排序二叉树,是一种特殊的二叉树数据结构,其中每个节点具有以下特性:左子树上所有节点的值均小于...
是Binary Search Tree code 二叉检索树的代码,实现了插入,删除,检索,遍历,包括先序遍历,中序遍历,后序遍历
设二叉排序树的二叉链表存储结构的类型定义如下: typedef struct node{ int data; //用整数表示一个结点的名 struct node *LChild,*RChild; //左右指针域 }BSTNode,*BSTree; 设计算法并编写程序求解以下几个问题...
- **二叉检索树**(Binary Search Tree, BST)是一种特殊的二叉树,它满足以下条件: - 该树可以为空树。 - 若非空,则每个节点具有一个键值(Key),并且对于任一节点N来说,如果N的键值为K,那么N的左子树中所有...
构建一个排序二叉树,然后删除其中一个结点,使剩下的结点仍构成一个排序二叉树
cout建立一棵二叉排序树,请输入你要建树的所有数(以-1 作为结束标志!): "; Head=NULL; int number; cin>>number; while(number!=-1) { Head=buildTree(Head,number); cin>>number; } } template ...
二叉排序树(Binary Sort Tree,BST),也称为二叉查找树或有序二叉树,是一种特殊类型的二叉树,其每个节点的左子树只包含比其小的元素,右子树包含比其大的元素,且整个树保持自平衡。在本实验报告中,我们将深入...
总的来说,理解和掌握二叉排序树的增删改查操作对于iOS开发者来说是非常有益的,它能帮助优化数据存储和检索,提高程序的效率。通过实践和调试,你可以深入理解这些基本操作背后的逻辑,这对于提升编程技能和解决...
二叉排序树广泛用于数据库索引、文件系统和虚拟内存管理等场景,而折半查找常用于大量有序数据的快速检索,如电子词典的单词查找。 9. **优化**: 对于频繁查询的场景,可以使用自平衡二叉排序树,如AVL树和红黑...
二叉排序树(Binary Search Tree,BST),又称为二叉查找树或有序二叉树,是一种自平衡的二叉树数据结构。它在计算机科学中扮演着重要角色,特别是在数据检索、排序和组织方面。VC++是Microsoft开发的一款集成开发...
最优二叉搜索树,也称为最优化二叉查找树或动态二叉查找树,是一种特殊的二叉树数据结构,它的每个节点都包含一个键值和两个子节点,左子节点的键值小于当前节点,右子节点的键值大于当前节点。在最优二叉搜索树中,...
在"二叉查找树实现简单的信息检索"中,我们关注的是如何利用二叉查找树来高效地检索信息。首先,我们需要创建一个二叉查找树的数据结构。在提供的文件中,`Binary_tree.h`和`Binary_tree.cpp`很可能是定义和实现这个...