【C++研发面试笔记】9. 基本数据结构-二叉查找树BST
2016-10-02 20:29
716 查看
【C++研发面试笔记】9. 基本数据结构-二叉查找树BST
BST树即二叉搜索树,其满足如下条件:1.所有非叶子结点至多拥有两个儿子(Left和Right);
2.所有结点存储一个关键字;
3.非叶子结点的左指针指向小于其关键字的子树,右指针指向大于其关键字的子树;
9.1 BST树的搜索
从根结点开始,如果查询的关键字与结点的关键字相等,那么就命中;否则如果查询关键字比结点关键字小,就进入左儿子;
如果比结点关键字大,就进入右儿子;
如果左儿子或右儿子的指针为空,则报告找不到相应的关键字;
如果BST树的所有非叶子结点的左右子树的结点数目均保持差不多(平衡),那么B树的搜索性能逼近二分查找;但它比连续内存空间的二分查找的优点是,改变BST树结构(插入与删除结点)不需要移动大段的内存数据,甚至通常是常数开销;
同样的关键字集合有可能导致不同的树结构索引;所以,使用BST树还要考虑尽可能让BST树保持左图的结构,和避免右图的结构,也就是所谓的“平衡”问题;
9.2 BST的建立
9.2.1 结构
9.2.2 插入
递归方法:
9.2.3 构建
9.2.4 查找
递归方法:
先序遍历
中序遍历
9.2.5 删除节点
删除操作也类似于查找,是个递归过程,只不过删除操作在找到被删除节点后的处理要复杂些,需考虑下面4种情形:当前节点的关键值等于待删除关键值,则进入删除处理过程;
当前节点的关键值小于待插入节点关键值,根据BST的定义,应在当前节点的左子树上递归删除操作;
当前节点的关键值大于待插入节点关键值,根据BST的定义,应在当前节点的右子树上递归删除操作;
若当前节点为空,则说明查找不到待删除关键值的节点,返回-1指示删除失败。
删除处理过程又需要考虑以前几种情形:
待删除节点为叶子节点(左右孩子均为空);
a) 将待删除节点的父节点指向该待删除节点的指针置为空,
b) 删除待删除节点。
待删除节点的左孩子为空,右孩子非空;
a) 将待删除节点的父节点重新指向待删除节点的右孩子
b) 删除待删除节点。
待删除节点的左孩子非空,右孩子为空;
a) 将待删除节点的父节点重新指向待删除节点的左孩子
b) 删除待删除节点
待删除节点的左孩子非空,右孩子非空。
a) 将待删除节点的关键值与其右子树上值最小节点的值交换
b) 也可以选择待删除节点左子树上的最大值节点进行交换
这篇博文是个人的学习笔记,内容许多来源于网络(包括CSDN、博客园及百度百科等),博主主要做了微不足道的整理工作。由于在做笔记的时候没有注明来源,所以如果有作者看到上述文字中有自己的原创内容,请私信本人修改或注明来源,非常感谢>_<
相关文章推荐
- 【C++研发面试笔记】10. 基本数据结构-平衡二叉搜索树AVL
- 【C++研发面试笔记】17. 基本数据结构-图结构
- 【C++研发面试笔记】7. 基本数据结构-单链表
- 【C++研发面试笔记】6. 基本数据结构-数组
- 【C++研发面试笔记】11. 基本数据结构-红黑树RBT
- 【C++研发面试笔记】13. 基本数据结构-哈夫曼树、树堆及其他树簇
- 【C++研发面试笔记】16. 基本数据结构-队列queue与栈stack
- 【C++研发面试笔记】12. 基本数据结构-B树簇
- 【C++研发面试笔记】8. 基本数据结构-二叉堆
- 【C++研发面试笔记】15. 基本数据结构-字符串string
- 【C++研发面试笔记】14. 基本数据结构-查找表与并查集
- 【C++研发面试笔记】4. 指针与引用
- 【C++研发面试笔记】5. C++ STL数据结构
- 【C++研发面试笔记】18. 常用算法-查找算法
- 【C++研发面试笔记】20. 常用算法-路径搜索算法(图算法)
- 【C++研发面试笔记】2. 多态性
- 【C++研发面试笔记】22. 常用算法-字符串查找算法
- 【C++研发面试笔记】19. 常用算法-排序算法
- 【C++研发面试笔记】3. 命名空间与内存管理
- 【C++研发面试笔记】1. C++常见关键字含义