二叉搜索树(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. Servlet页面跳转实现方法的区别

    一直对Servlet页面跳转的几种方式理解的糊里糊涂的,今天在网上搜了一把,找到一遍比较好的,记下来,以后看看. Servlet页面跳转分两部分,一是发生在Servlet,一是在JSP,其实JSP也就 ...

  2. 查询使用NoLock

    当我们在操作数据库的时候,无论是查询还是修改数据库的操作我们都习惯使用using(var db=new XXXDB()){},但是如果仅仅是做查询,最好是使用NoLock,因为NoLock使用的是共享 ...

  3. HDU 1754 单点更新,求区间最大值

    I Hate It Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. Codeforces Round #378 (Div. 2) D题(data structure)解题报告

    题目地址 先简单的总结一下这次CF,前两道题非常的水,可是第一题又是因为自己想的不够周到而被Hack了一次(或许也应该感谢这个hack我的人,使我没有最后在赛后测试中WA).做到C题时看到题目情况非常 ...

  5. const的全面理解

    const关键字用来作甚?const是一个类型修饰符.常见的类型修饰符有哪些? short long unsigned signed static autoextern register 定义一个变量 ...

  6. 在Android library中不能使用switch-case语句访问资源ID的原因分析及解决方案

    转自:http://www.jianshu.com/p/89687f618837 原因分析   当我们在Android依赖库中使用switch-case语句访问资源ID时会报如下图所示的错误,报的错误 ...

  7. 黑马程序员——C语言基础语法 关键字 标识符 注释 数据及数据类型

    Java培训.Android培训.iOS培训..Net培训.期待与您交流! (一下内容是对黑马苹果入学视频的个人知识点总结) (一)C语言简单介绍 (1)C语言程序是由函数组成的任何C语言程序都是由一 ...

  8. matlab blkproc

    有关blkproc 命令的使用 (2011-07-31 09:52:57) 标签: 杂谈 分类: matlab使用 如果你让matlab帮你计算最好的块大小,用bestblk函数,[MB,NB] = ...

  9. ASP.NET读取EXCEL文件的三种经典方法(转)

    1.方法一:采用OleDB读取EXCEL文件:  把EXCEL文件当做一个数据源来进行数据的读取操作,实例如下:public DataSet ExcelToDS(string Path) {  str ...

  10. Coudera-Manager/CDH的安装和部署

    由于之前部署的集群采用的是用apache hadoop的方式来实现,但是考虑到运维的成本问题,下面将apache hadoop转换成cloudera cdh.下面主要讲解一下cloudera cdh的 ...