数据结构-查找-树表查找-科班学习笔记
(阅读说明)本篇为查找的第二篇,相关基础概念参考第一篇
查找1
如需运行调试本篇的代码,请前往
可运行代码
树表的查找是基于二叉排序树的,先来看看二叉排序树是什么
二叉排序树(Binary sort tree)
又称二叉查找树,也称二叉搜索树,它的特征是
- 若它的左子树非空,则左子树上所有结点值(指关键字值)均小于根结点值;
- 若它的右子树非空,则右子树上所有结点值均大于根结点值;
- 左、右子树本身又各是一棵二叉排序树。
注意:二叉排序树中没有相同关键字(key)的结点
结点定义如下
typedef struct BiTNode /* 结点结构 */
{
int data; /* 结点数据 */
struct BiTNode *lchild, *rchild; /* 左右孩子指针 */
} BiTNode, *BiTree;
二叉排序树如何查找
将给定的key值(关键字)于二叉排序树的根结点的关键字进行比较
- 若相等,则查找成功
- 若小于,则继续在该结点的左子树上进行查找
- 若大于,则继续在该结点的右子树上进行查找
以上过程是个简单的递归过程
代码如下
/* 递归查找二叉排序树T中是否存在key, */
/* 指针f指向T的双亲,其初始调用值为NULL */
/* 若查找成功,则指针p指向该数据元素结点,并返回TRUE */
/* 否则指针p指向查找路径上访问的最后一个结点并返回FALSE */
Status SearchBST(BiTree T, int key, BiTree f, BiTree *p)
{
if (!T) /* 查找不成功 */
{
*p = f;
return FALSE;
}
else if (key==T->data) /* 查找成功 */
{
*p = T;
return TRUE;
}
else if (key<T->data)
return SearchBST(T->lchild, key, T, p); /* 在左子树中继续查找 */
else
return SearchBST(T->rchild, key, T, p); /* 在右子树中继续查找 */
}
二叉排序树的插入
在二叉排序树中插入一个关键字为k的新结点,要保证插入后仍满足BST性质
插入过程如下
- 若二叉排序树T为空,则创建一个key域为k的结点,作之为根
- 否则将k于根结点的关键字比较,若相等,无需插入,直接返回0
- 若kkey,则将k插入根结点的左子树
- 否则插入右子树
以上过程是个简单的递归过程
代码如下