您的位置:首页 > 理论基础 > 数据结构算法

【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、博客园及百度百科等),博主主要做了微不足道的整理工作。由于在做笔记的时候没有注明来源,所以如果有作者看到上述文字中有自己的原创内容,请私信本人修改或注明来源,非常感谢>_<
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息