二叉搜索树
一、二叉搜索树的查找和插入:
删除时:1、找值为x的节点
2、删除:
(1)没有左右孩子(叶子节点):可以直接删除,删除后将叶子节点的上一级节点指向空(否则会成为野指针)。
(2)只有左孩子:
a、待删除节点不是根节点:带删除节点是双亲的左孩子:删除左子树的左孩子(该左孩子没有右孩子):让双亲的左孩子指向要删除的左孩子
b、待删除节点不是根节点:待删除节点是双亲的右孩子:删除右子树的左孩子:让双亲的右指向待删除元素的左
c、待删除节点是根节点:直接删除:根节点只有左子树,没有右子树:不改变根的指向
(3)只有右孩子:
(4)左右孩子均存在:在右子树中找最小的节点,交给待删除节点,在右子树中删除替代节点
二、递归实现二叉树的增加,查找,删除
二叉树的插入先找位置(若树不为空,则从根开始插入,二叉搜索树中插入的每一个值都是唯一的。比根节点小则朝左边插入,比根节点大则向右侧插入,在这个过程中需要把双亲节点保存起来,pCur走到空的位置,位置找到了保存在双亲的指针域中),再插入。
二叉树的删除:也分为两步:(1)找节点(先和根相比,如果和根相等则找到了;如果不相等,比根小则朝左边找,若是比根大则朝右边找,只要节点找到了就可有将节点删除(2)删除:分为四种情况:a、叶子节点;b、只有右孩子;c、只有左孩子;
d、左右孩子都存在【叶子节点可以和只有左孩子或者只有右孩子合并起来】
三、二叉搜索树的应用
1、判断一个单词是否拼写正确
(1)方式一:把单词和集合里面的单词一个个进行对比,如果单词和集合里面的某一个单词相等,则单词的拼写没有问题;如果不相等则出错了:时间复杂度为:O(n),操作也不方便
(2)方式二:利用二叉搜索树的方式实现:单词比根小则在左子树的位置,单词比根大则在右子树的位置。比到单词找到为止,找到叶子节点的位置都没有找到,则单词拼写错误,没有找到
2、模拟实现一个简单的字典
存放单词及单词对应的中文含义(一一对应的关系),把具有一一对应关系的称之为键值对key和value具有一一对应的关系。一般来说key是唯一的是否唯一取决于具体的场景。有些场景key是可以重复的,比如一个单词对应多个意思或者容器类(multimap中键值对是可以重复的)
3、log文件中有许多异常重复的IP地址,请统计每个异常IP出现了多少次
将IP地址作为键值对key,将每个单词出现的次数作为value,用这个键值对建立起二叉索搜树,
也可以不存放字符串而是把字符串转换成整型的数据(一个库函数)
atoi:把数字类型的字符串转换成整型的数据
二叉搜索树里面查找某一个元素有序(接近有序)时,二叉索搜树退化为一个线性的结构,的时间复杂度时O(n)
四、解决二叉索搜树单支的情况(不平衡的情况):平衡树
平衡树:左子树和右子树的高度之差的绝对值不能超过1(个节点下面只有一个节点时),空树也是平衡树。
AVL树的左右子树都是AVL树,左右子树高度之差,叫做平衡因子,平衡因子不超过1,则是平衡树。
平衡树也是一棵二叉搜索树。
浙公网安备 33010602011771号