二叉排序树
2012-04-05 23:48
176 查看
1.定义
二叉排序树(Binary Search Tree)又称二叉搜索(查找)树,其定义如下:
(1)若它的左子树非空,则左子树上所有结点的权值都比根结点的权值小;
(2)若它的右子数非空,则右子树上所有结点的权值都比根结点的权值大;
(3)左、右子树本身又是一棵二叉排序树。
以上既是二叉排序树的定义,同时也是它的性质。从定义可以看出,二叉排序树的定义是一个递归的定义。对于一棵二叉排序树的中序遍历则是一个递增有序序列。
2.二叉排序树的插入Insert
根据二叉排序树的递归定义,进行插入操作的时候可以用递归实现,其插入过程如下:
(1)如果二叉排序树为空,则创建一个关键字为key的结点,并将其作为根结点;
(2)否则将key和根结点的key值比较,若相等则返回;
1)若key值小于根结点的key值,判断根结点的左孩子是否为空,如果为空,则创建一个关键字为key的结点,并将该结点作为根结点的
左孩子;如果不为空,则递归插入到该根结点的左子树当中。
2)若key值大于根结点的key值,判断根结点的右孩子是否为空,如果为空,则创建一个关键字为key的结点,并将该结点作为根结点的
右孩子;如果不为空,则递归插入到该根结点的右子树当中。
递归实现:
?
非递归实现:
?
3.二叉排序树的查找
最坏情况的查找是二叉排序树行成的是一个高度为n的线性树,其平均查找长度跟顺序查找的相同,为n+1/2;
最好情况是与二分判定树形态相同,其平均查找长度和二分查找相同为logn;
?
?
关于二叉排序树的运用可以看一下POJ2418
http://poj.org/problem?id=2418
这道题目有2种解法,一种是采用二叉排序树去实现,一种是直接采用STL模板实现,下面只给出STL的实现。
?
二叉排序树(Binary Search Tree)又称二叉搜索(查找)树,其定义如下:
(1)若它的左子树非空,则左子树上所有结点的权值都比根结点的权值小;
(2)若它的右子数非空,则右子树上所有结点的权值都比根结点的权值大;
(3)左、右子树本身又是一棵二叉排序树。
以上既是二叉排序树的定义,同时也是它的性质。从定义可以看出,二叉排序树的定义是一个递归的定义。对于一棵二叉排序树的中序遍历则是一个递增有序序列。
2.二叉排序树的插入Insert
根据二叉排序树的递归定义,进行插入操作的时候可以用递归实现,其插入过程如下:
(1)如果二叉排序树为空,则创建一个关键字为key的结点,并将其作为根结点;
(2)否则将key和根结点的key值比较,若相等则返回;
1)若key值小于根结点的key值,判断根结点的左孩子是否为空,如果为空,则创建一个关键字为key的结点,并将该结点作为根结点的
左孩子;如果不为空,则递归插入到该根结点的左子树当中。
2)若key值大于根结点的key值,判断根结点的右孩子是否为空,如果为空,则创建一个关键字为key的结点,并将该结点作为根结点的
右孩子;如果不为空,则递归插入到该根结点的右子树当中。
递归实现:
?
?
最坏情况的查找是二叉排序树行成的是一个高度为n的线性树,其平均查找长度跟顺序查找的相同,为n+1/2;
最好情况是与二分判定树形态相同,其平均查找长度和二分查找相同为logn;
?
http://poj.org/problem?id=2418
这道题目有2种解法,一种是采用二叉排序树去实现,一种是直接采用STL模板实现,下面只给出STL的实现。
?
相关文章推荐
- 二叉排序树
- pascal语言实现二叉排序树
- 二叉排序树
- 二叉排序树构造学生管理系统
- BinarySortTree二叉排序树(2010年12月07日)
- 数据结构与算法学习之二叉排序树及二叉排序树的相关操作
- 1404 二叉排序树中查找
- 二叉查找树(二叉排序树)的详细实现
- 二叉排序树的创建
- 二叉排序树经典算法速成:”二叉排序树“。
- 动态查找之二叉排序树
- 数据结构 - 二叉排序树
- 二叉排序树的建立和树中节点的查找删除操作
- 二叉排序树
- 二叉排序树的创建和遍历与删除指定的节点
- VC++2012编程演练数据结构《12》二叉排序树
- 【July第1题】二叉排序树转换成双链表
- 二叉排序树删除操作
- 动态查找表之二叉排序树
- 1367判断一个数组是否为二叉排序树的后序遍历结果