1. 二叉搜索树
1.1.二叉搜索树概念
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树:若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树也就是说,搜索二叉树的任意一个子树都需要满足,左子树的值<根<右子树的值注:
1.当搜索二叉树接近完全时,数据的查找效率较高,接近。
2.当使用中序遍历遍历搜索二叉树时,遍历出来的数据是增序的。
1.2.二叉搜索树的实现
BinarySearchTree.h文件:
test.cpp文件:
注:
1. 二叉搜索树的查找介绍
a.从根开始比较,查找,比根大则往右边走查找,比根小则往左边走查找。
b.最多查找高度次,走到到空,还没找到,这个值不存在。
2. 二叉搜索树的插入介绍
插入的具体过程如下:
a.树为空,则直接新增节点,赋值给root指针
b.树不空,按二叉搜索树性质查找插入位置,插入新节点
具体思路为:定义两个指针parent和cur,cur查找插入位置,parent记录cur上一个位置,当cur找到插入位置时(cur为空时),开辟节点给cur并和parent进行链接。
注:
(1)搜索二叉树一般不允许插入和里面数据相同的数据,会造成冗余。
(2)搜索二叉树数据插入的顺序不同,树的形状一般也不同,当以近似有序的数据顺序依次插入,那么二叉树的形状近似一个链表,搜索的时间复杂度接近O(N)
3. 二叉搜索树的删除
首先查找元素是否在二叉搜索树中,如果不存在,则返回, 否则要删除的结点可能分下面四种情况:
a. 要删除的结点无孩子结点
b. 要删除的结点只有左孩子结点
c. 要删除的结点只有右孩子结点
d. 要删除的结点有左、右孩子结点
看起来有待删除节点有4中情况,实际情况a可以与情况b或者c合并起来,因此真正的删除过程如下:
情况b:删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点--直接删除
情况c:删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点--直接删除
情况d:在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点
中,再来处理该结点的删除问题--替换法删除
4.搜索二叉树上面这种结构允许增删查功能,不允许改,修改一个节点的数值那么这个树很可能不再是搜索二叉树。