二叉搜索树(BST,Binary Search Tree),也称二叉排序树二叉查找树

二叉搜索树:一棵二叉树,可以为空;如果不为空,满足以下性质:

  • 非空左子树的所有键值小于其根结点的键值;
  • 非空右子树的所有键值大于其根结点的键值;
  • 左右子树都是二叉搜索树;

Wiki中的定义

  • The left subtree of a node contains only nodes with keys less than the node's key.
  • The right subtree of a node contains only nodes with keys greater than the node's key.
  • The left and right subtrees each must also be a binary search tree.
  • Each node can have up to two successor nodes.
  • There must be no duplicate nodes.
  • A unique path exists from the root to every other node.

二叉搜索树操作的特别函数:

Position Find(ElementType X,BinTree BST):从二叉搜索树BST查找元素X,返回其所在结点的地址;

Position FindMin(BinTree BST):从二叉搜索树BST中查找并返回最小元素所在结点的地址;

Position FindMax(BinTree BST):从二叉搜索树BST中查找并返回最大元素所在结点的地址;

BinTree Insert(ElementType X,BinTree BST):把元素X结点插入到二叉搜索树BST中;

BinTree Delete(ElementType X,BinTree BST):从二叉搜索树BST中删除元素X结点;


【二叉搜索树的查找操作:Find】

1、查找从根结点开始,如果树为空,返回NULL;

2、若搜索树非空,则根结点关键字和X进行比较,并进行不同处理:

  • 如果X小于根结点的键值,只需在左子树中继续搜索;
  • 如果X大于根结点的键值,只需在右子树中继续搜索;
  • 若两者比较结果是相等,搜索完成,返回指向此结点的指针;

递归查找操作:

 Position BST_Find(ElementType X, BinTree BST)
{
if(BST == NULL)
return NULL; if(X > BST->Data)
return BST_Find(X, BST->Right);
else if(X < BST->Data)
return BST_Find(X, BST->Left);
else
return BST;
}

非递归查找操作:

 Postion BST_Find_ext(ElementType X, BinTree BST)
{
while(BST != NULL)
{
if(X > BST->Data)
BST = BST->Right;
else if(X < BST->Data)
BST = BST->Left;
else
return BST;
}
return NULL;
}

【二叉搜索树查找最大元素FindMax和最小元素FindMin】

最大元素一定是在树的最右分支的端结点上;

最小元素一定是在树的最左分支的端结点上;

递归查找Min和Max:

 Position BST_FindMin(BinTree BST)
{
if(BST == NULL)
return NULL;
else if(BST->Left == NULL)
return BST;
else
return BST_FindMin(BST->Left);
} Position BST_FindMax(BinTree BST)
{
if(BST == NULL)
return NULL;
else if(BST->Right == NULL)
return BST;
else
return BST_FindMax(BST->Right);
}

非递归查找Min和Max:

 Position BST_FindMin_ext(BinTree BST)
{
if(BST != NULL)
{
while(BST->Left != NULL)
BST = BST->Left;
}
return BST;
} Position BST_FindMax_ext(BinTree BST)
{
if(BST != NULL)
{
while(BST->Right != NULL)
BST = BST->Right;
}
return BST;
}

【二叉搜索树的插入操作:Insert】

 BinTree BST_Insert(ElementType X, BinTree BST)
{
if(BST == NULL)
{
// 若原树为空,生成并返回一个结点的二叉搜索树
BST = malloc(sizeof(struct TreeNode));
BST->Data = X;
BST->Left = NULL;
BST->Right = NULL;
}
else
{
// 开始找要插入元素的位置
if(X < BST->Data)
BST->Left = BST_Insert(X, BST->Left); // 递归插入左子树
else if(X > BST->Data)
BST->Right = BST_Insert(X, BST->Right); // 递归插入右子树
// else X已经存在,什么都不做
}
return BST;
}

【二叉搜索树的删除操作:Delete】

二叉搜索树的删除操作需要考虑三种情况:

  • 要删除的是叶结点:直接删除,并修改其父结点指针置为NULL;
  • 要删除的结点只有一个孩子结点:将其父结点的指针指向要删除结点的孩子结点;
  • 要删除的结点有左右两棵子树:用另一个结点替代被删除结点,右子树的最小元素 或者 左子树的最大元素;
 BinTree BST_Delete(ElementType X, BinTree BST)
{
Position Tmp; if(BST == NULL)
{
printf("warning: xxx\n"); // 未找到要删除的元素
}
else if(X < BST->Data)
{
BST->Left = BST_Delete(X, BST->Left); // 左子树递归删除
}
else if(X > BST->Data)
{
BST->Right = BST_Delete(X, BST->Right); // 右子树递归删除
}
else
{
// 被删除结点有左右两个子结点
if(BST->Left != NULL && BST->Right != NULL)
{
// 在右子树中找到最小的元素填充删除结点
Tmp = BST_FindMin(BST->Right);
BST->Data = Tmp->Data;
// 在删除结点的右子树中删除最小元素
BST->Right = BST_Delete(BST->Data, BST->Right);
}
else // 被删除结点有一个或无子结点
{
Tmp = BST;
if(BST->Left == NULL) // 有右孩子或者无子结点
BST = BST->Right;
else if(BST->Right == NULL) // 有左孩子或者无子结点
BST = BST->Left;
free(Tmp);
}
}
return BST;
}

Wiki链接:

Binary_search_tree :http://en.wikipedia.org/wiki/Binary_search_tree

二叉搜索树(Binary Search Tree)的更多相关文章

  1. 编程算法 - 二叉搜索树(binary search tree) 代码(C)

    二叉搜索树(binary search tree) 代码(C) 本文地址: http://blog.csdn.net/caroline_wendy 二叉搜索树(binary search tree)能 ...

  2. 数据结构 《5》----二叉搜索树 ( Binary Search Tree )

    二叉树的一个重要应用就是查找. 二叉搜索树 满足如下的性质: 左子树的关键字 < 节点的关键字 < 右子树的关键字 1. Find(x) 有了上述的性质后,我们就可以像二分查找那样查找给定 ...

  3. [Data Structure] 二叉搜索树(Binary Search Tree) - 笔记

    1. 二叉搜索树,可以用作字典,或者优先队列. 2. 根节点 root 是树结构里面唯一一个其父节点为空的节点. 3. 二叉树搜索树的属性: 假设 x 是二叉搜索树的一个节点.如果 y 是 x 左子树 ...

  4. 二叉搜索树(Binary Search Tree)(Java实现)

    @ 目录 1.二叉搜索树 1.1. 基本概念 1.2.树的节点(BinaryNode) 1.3.构造器和成员变量 1.3.公共方法(public method) 1.4.比较函数 1.5.contai ...

  5. 二叉搜索树(Binary Search Tree)实现及测试

    转:http://blog.csdn.net/a19881029/article/details/24379339 实现代码:  Node.java  //节点类public class Node{ ...

  6. 二叉搜索树 (BST) 的创建以及遍历

    二叉搜索树(Binary Search Tree) : 属于二叉树,其中每个节点都含有一个可以比较的键(如需要可以在键上关联值), 且每个节点的键都大于其左子树中的任意节点而小于右子树的任意节点的键. ...

  7. [LeetCode] Split BST 分割二叉搜索树

    Given a Binary Search Tree (BST) with root node root, and a target value V, split the tree into two ...

  8. 自己动手实现java数据结构(六)二叉搜索树

    1.二叉搜索树介绍 前面我们已经介绍过了向量和链表.有序向量可以以二分查找的方式高效的查找特定元素,而缺点是插入删除的效率较低(需要整体移动内部元素):链表的优点在于插入,删除元素时效率较高,但由于不 ...

  9. BinarySearchTree二叉搜索树的实现

    /* 二叉搜索树(Binary Search Tree),(又:二叉查找树,二叉排序树)它或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; ...

  10. 二叉搜索树(BST)---python实现

    github:代码实现 本文算法均使用python3实现 1. 二叉搜索树定义   二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree).   二叉搜 ...

随机推荐

  1. The APR based Apache Tomcat Native library 异常解决办法

    tomat在linux服务器上启动报The APR based Apache Tomcat Native library which allows optimal performance in pro ...

  2. 简单分析Java的HashMap.entrySet()的实现

    关于Java的HashMap.entrySet(),文档是这样描述的:这个方法返回一个Set,这个Set是HashMap的视图,对Map的操作会在Set上反映出来,反过来也是.原文是 Returns ...

  3. HtmlAgilityPack解析全国区号页面到XML

    需求:完成一个城市和区号的xml配置文件 处理思路:通过HtmlAgilityPack解析一个区号页面,生产xml文件 页面:http://www.hljboli.gov.cn/html/code.h ...

  4. js正则表达式和replace

    javascript中replace与正则表达式 replace()最简单的算是能力就是简单的字符替换.示例代码如下: <script language="javascript&quo ...

  5. tarjan求强联通分量 模板

    void tarjan(int u) { dfn[u]=low[u]=++dfs_clock; stack_push(u); for (int c=head[u];c;c=nxt[c]) { int ...

  6. 一模 (1) day1

    第一题:(水题) 题目大意:求出n个  X% (X是小于等于2位的整数) 的乘积,去掉末尾的0: 解题过程: 1.直接 把整数乘好,然后确定小数点的位置,去掉多余的0 输出即可. 第二题:(搜索题) ...

  7. 谷歌 不支持 activeX插件

    因为Chrome浏览器42以上版本已经陆续不再支持NPAPI插件,也就是说,目前的迅雷插件.FLASH插件.支付宝插件.阿里旺旺插件.百度贴吧.网银等网站都受到一定程度的影响,本文分享给大家如何让谷歌 ...

  8. 【转】linux下如何查看某个软件 是否安装?安装路径在哪

    以redhat\centos 中php-mysql为例1:如果包是通过yum或者rpm方式安装[root@localhost yum.repos.d]# rpm -qa //找出系统所有的包,找到对应 ...

  9. 给伪类设置z-index= -1;

    .column{ position: relative; float: left; padding: 30px 0; width: 25%; z-index: 0; background-color: ...

  10. 转:HashMap深度解析(一)

      HashMap哈希码hashCodeequals 本文来自:高爽|Coder,原文地址:http://blog.csdn.net/ghsau/article/details/16843543,转载 ...