&12-2 查找二叉搜索树

#1,定理

在一棵高度为h的二叉搜索树上,动态集合上的操作SEARCH、MINIMUM、MAXIMUM、SUCCESSOR和PREDECESSOR可以在O(h)时间内完成。

#2,伪代码

分别是搜索,迭代形式的搜索,取最小值,取最大值,找后继,找前驱。

1 //x is an element of the tree, k is the key of element we want to search.
2 TREE-SEARCH(x,k)
3 if x==NULL or k==x.key
4     return x;
5
6 if k<x.key
7     return TREE-SEARCH(x.left,k);
8 else
9     return TREE_SEARCH(x.right,k);

TREE-SEARCH

1 ITERATIVE_TREE_SEARCH(x,k)
2 while x!=NULL and k!=x.key
3     if k<x.key
4         x=x.left;
5     else
6         x=x.right;
7 return x;

ITERATIVE_TREE_SEARCH

1 TREE-MINIMUM(x)
2 while x.left!=NULL
3     x=x.left;
4 return x;

TREE-MINIMUM

1 TREE-MAXIMUM(x)
2 while x.right!=NULL
3     x=x.right;
4 return x;

TREE-MAXIMUM

1 TREE-SUCCESSOR(x)
2 if x.right!=NULL
3     return TREE_MINIMUM(x.right);
4 y=x.p;
5 while y!=NULL and x==y.right
6     x=y;
7     y=y.p;
8 return y;

TREE-SUCCESSOR

1 TERR-PREDECESSOR(x)
2 if x.left!=NULL
3     return MAXIMUM(x.left);
4 y=x.p;
5 while y!=NULL and x==y.right
6     x=y;
7     y=y.p;
8 return y;

TERR-PREDECESSOR

时间: 2024-10-12 05:08:47

&12-2 查找二叉搜索树的相关文章

数据结构(六)查找---二叉搜索树(排序树)

前提 前面的查找我们都是静态查找,因为数据集是有序存放,查找的方法有多种,可以使用折半,插值,斐波那契等,但是因为有序,在插入和删除操作上的效率并不高. 这时我们就需要一种动态查找方法,既可以高效实现查找,又可以使得插入和删除效率不错,这时我们可以考虑二叉排序树 二叉排序树 一:定义 又称为二叉搜索树(查找树),是一棵树,可以为空,但是需要满足以下性质: 1.非空左子树的所有键值小于其根节点的键值 2.非空右子树的所有键值大于其根节点的键值 3.左右子树都是二叉搜索树 二:操作 查找 /* Bi

【算法导论】学习笔记——第12章 二叉搜索树

搜索树数据结构支持多种动态集合操作,包括SEARCH.MINIMUM.MAXIMUM.PREDECESSOR.SUCCESSOR.INSRT和DELETE操作等.基本的搜索树就是一棵二叉搜索树.12.1 什么是二叉搜索树1. 二叉搜索树的性质:设x是二叉搜索树中的一个结点.如果y是x左子树中的一个结点,那么y.key<=x.key.如果y是x右子树中的一个结点,那么y.key>=x.key.三种遍历时间复杂度是O(n),这是显然的. 12.1-3 1 void Inorder_Tree_Wal

二叉搜索树JavaScript实现

* 什么是二叉搜索树?其形式就是二叉树,对于每个节点x,其左子树的值<=x.value,右子树的值>=x.value. * 对于二叉搜索树,我们可以使用中序遍历,得到树上从小到大所有的元素.时间复杂度平均为O(n). function inorderTreeWalk(x) { if(x!== null) { inorderTreeWalk(x.left); print(x.key); inorderTreeWalk(x.right); } } * 当我们想要查询二叉搜索树中某个关键字应该怎么做

二叉搜索树转换为有序双向链表

http://blog.csdn.net/ljianhui/article/details/22338405 一.问题描述 输入一棵二叉搜索树,现在要将该二叉搜索树转换成一个排序的双向链表.而且在转换的过程中,不能创建任何新的结点,只能调整树中的结点指针的指向来实现. 二.实现思路 在二叉搜索树中,每个结点都有两个分别指向其左.右子树的指针,左子树结点的值总是小于父结点的值,右子树结点的值总是大于父结点的值.而在双向链表中,每个结点也有两个指针,它们分别指向前一个结点和后一个结点.所以这两种数据

二叉搜索树的一些操作的C++实现

头文件: #include<iostream> using namespace std; typedef struct BiTNode { int data; int key; struct BiTNode *parent, *lchild, *rchild; }BiTNode, *BiTree; BiTree Tree_Search(BiTree x, int k); void Tree_Walk(BiTree x); BiTree Tree_Minimun(BiTree x); BiTre

数据结构(6) -- 构建二叉搜索树

//BinTree.h #ifndef BINTREE_H_ #define BINTREE_H_ #define ElemType int typedef struct _PNode { ElemType data; _PNode *left; _PNode *right; }PNode; class BinTree { private: PNode *root; public: BinTree(); ~BinTree(); PNode* GetRoot(); //获得根节点 void Set

算法导论(Introduction to Algorithms )— 第十二章 二叉搜索树— 12.1 什么是二叉搜索树

搜索树数据结构支持许多动态集合操作,如search(查找).minmum(最小元素).maxmum(最大元素).predecessor(前驱).successor(后继).insert(插入).delete(删除),这些都是基本操作,可以使用一颗搜索树当做一个字典或者一个优先队列. 12.1.什么事二叉搜索树 二叉搜索树是以一棵二叉树来组织的,可以用一个链表数据结构来表示,也叫二叉排序树.二叉查找树: 其中的每个结点都是一个对象,每个对象含有多个属性(key:该结点代表的值大小,卫星数据:不清楚

【数据结构】第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

二叉搜索树的查找

---------------------siwuxie095 二叉搜索树的查找 程序:二叉搜索树和顺序查找表的查找对比 FileOps.h: #ifndef FILEOPS_H #define FILEOPS_H #include <string> #include <iostream> #include <fstream> #include <vector> using namespace std; namespace FileOps { int fir