算法导论—二叉搜索树(BST)

华电北风吹

天津大学认知计算与应用重点实验室

日期:2015/9/9

与散列表一样,搜索树数据结构也支持动态集合操作,包含插入,查询,删除,最小值,最大值,前驱,后继等。

一、二叉搜索树:

二叉搜索树节点:关键字key,卫星数据,左孩子指针,右孩子指针,父节点指针,其他特殊类型(红黑树的节点颜色,AVL树的树高等)。

二叉搜索树性质:x是二叉搜索树中的任意一个节点。若y是x左子树中任意一个节点有x.key>=y.key。若y是x右子树中任意一个节点有x.key<=y.key。

二、二叉搜索树的遍历

前序遍历:根节点+左子树+右子树

中序遍历:左子树+根节点+右子树

后序遍历:左子树+右子树+根节点

三、二叉搜索树的查询

1、查询给定关键字

根据二叉搜索树的性质查询即可。

2、最大关键字元素

寻找右子树的右子树,直到右子树没有右子树。

3、最小关键字元素

寻找左子树的左子树,直到左子树没有左子树。

4、给定节点的前驱(中序遍历)

分两种情况:1、若当前节点有左子树,寻找左子树的最大关键字元素,即为当前节点的前驱。2、若当前节点没有左子树,判断当前节点是否是父节点的左子树,若是则对父节点进行此判断,知道出现判断节点是父节点的右子树,返回判断节点的父节点。

5、给定节点的后继(中序遍历)

分两种情况:1、若当前节点有右子树,寻找右子树的最小关键字元素。2、若当前节点没有右子树,若当前节点是父节点的右子树,则对父节点进行此判断,直至出现判断节点是父节点的左子树,返回判断节点的父节点。

四、二叉搜索树的插入

根据二叉搜索树的性质插入即可。

五、二叉搜索树的删除

分三种情况:

1、需要删除的节点没有子树。单纯的删除即可。

2、需要删除的节点只有一个子树。只需要将当前节点的子树替换当前节点即可。

3、需要删除的节点有左右子树。将当前节点的后继节点(右子树的最小关键字元素)替换到当前节点,这时结构上相当于删除了当前节点的后继节点,由于最小关键字元素肯定没有左子树,对后继节点处利用性质1即可。

版权声明:本文为博主原创文章,未经博主允许不得转载。经过博主允许后转载的,必须全文转载,并且显著位置说明转载日期和来源链接。

时间: 2024-10-13 00:55:08

算法导论—二叉搜索树(BST)的相关文章

算法导论-----------二叉搜索树

先上二叉树查找树的删除的代码,因为删除是二叉查找树最复杂的操作: int BinarySearchTree<T>::tree_remove(const T& elem) { BinarySearchTreeNode<T> *z = tree_search(elem);//根据元素查找到要删除的节点 BinarySearchTreeNode<T> *x, *y; if (z != NULL) { //用y来表示实际要删除的节点 if (z->left ==

70 数组的Kmin算法和二叉搜索树的Kmin算法对比

[本文链接] http://www.cnblogs.com/hellogiser/p/kmin-of-array-vs-kmin-of-bst.html [分析] 数组的Kmin算法和二叉搜索树的Kmin算法非常类似,其本质是找序列中的第K大或者第K小的元素,可以借鉴QuickSort的思想加以实现. [Kmin_of_Array] C++ Code 1234567891011121314151617181920212223242526272829303132333435363738394041

数据结构-二叉搜索树(BST binary search tree)

本文由@呆代待殆原创,转载请注明出处:http://www.cnblogs.com/coffeeSS/ 二叉搜索树简介 顾名思义,二叉搜索树是以一棵二叉树来组织的,这样的一棵树可以用一个链表数据结构来表示,每个节点除了key和卫星数据(除了二叉树节点的基本数据以外人为添加的数据,这些数据和树的基本结构无关),还有left.right.parent,分别指向节点的左孩子.右孩子和父节点,如果对应的节点不存在则指向NIL节点(因为最简单的二叉搜索树中的NIL节点里并没有有用的信息,所以在实现的时候简

算法导论-二叉查找数

目录 引言 二叉查找树 节点定义 查找操作 插入操作 删除操作 二叉查找树存在问题 完整源码 讨论区 参考资料 内容                             1.引言                                   前面的文章介绍过二分查找.散列表查找:二分查找效率为Θ(lgn).二分查找要求数组是静态的,即元素不能动态的插入和删除,否则会耗费较多的时间:散列表查找效率可以到达Θ(1),但是一般用于“等于性查找“,不能进行“范围查找”;本文介绍的二叉查找树,(

【数据结构】第9章 查找! (二叉搜索树BST AVL树 B-(+)树 字典树 HASH表)

难产的笔记...本来打算用1天 结果前前后后拖了5天 §9.1 静态查找表 9.1.1 顺序表的查找 各种扫 自己脑补吧 复杂度O(n) 9.1.2 有序表的查找 若表是单调的,则可以利用二分查找.复杂度O(logn) 9.1.3 静态树表的查找 见 http://blog.csdn.net/area_52/article/details/43795837 9.1.4 索引顺序表的查找 建立索引表查找 §9.2 动态查找表 动态查找表的特点是,表结构本身是在查找过程中动态生成的,即对于给定值ke

二叉搜索树(BST)

(第一段日常扯蛋,大家不要看)这几天就要回家了,osgearth暂时也不想弄了,毕竟不是几天就能弄出来的,所以打算过完年回来再弄.这几天闲着也是闲着,就掏出了之前买的算法导论看了看,把二叉搜索树实现了下. #include <iostream> #include <memory> #include <vector> using namespace std; //节点结构 struct Node { int key; int num; shared_ptr<Node

数据结构与算法之二叉搜索树

与链表不同,树是一种非线性的数据结构.树中最常用的是二叉树,二叉树限制了子树的数量,也就是每个结点的子树至多2个,并且这两个子树是有顺序的.而二叉搜索树(二叉查找树,二叉排序树)是指根节点的关键字大于左子树的,而小于右子树,并且,左右子树也是一颗二叉搜索树.也就是说中序遍历一颗二叉搜索树,它的输出是从小到大排序好的. 除了普通的二叉搜索树之外,还有很多关于它的变形. 二叉平衡搜索树,即即是一颗二叉平衡树,也是一颗搜索树,平衡树即任意一个结点的左子树的高度与右子树的高度之差的绝对值不大于1. 红黑

C++算法之 二叉搜索树转换为双向链表

题目: 输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的节点,只能调整树中节点指针的方向: 分析: 1:由于要求链表是有序的,可以借助二叉树中序遍历,因为中序遍历算法的特点就是从小到大访问结点.当遍历访问到根结点时,假设根结点的左侧已经处理好,只需将根结点与上次访问的最近结点(左子树中最大值结点)的指针连接好即可.进而更新当前链表的最后一个结点指针. 2:由于中序遍历过程正好是转换成链表的过程,即可采用递归处理 代码: // BT.cpp : 定义控制台应用程序的

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

github:代码实现 本文算法均使用python3实现 1. 二叉搜索树定义 ??二叉搜索树(Binary Search Tree),又名二叉排序树(Binary Sort Tree). ??二叉搜索树是具有有以下性质的二叉树: ??(1)若左子树不为空,则左子树上所有节点的值均小于或等于它的根节点的值. ??(2)若右子树不为空,则右子树上所有节点的值均大于或等于它的根节点的值. ??(3)左.右子树也分别为二叉搜索树. 2. 二叉搜索树的相关操作 2.1 插入操作 ??从根节点开始,若插入