算法之二叉排序树的其它知识点讲解-二叉树删除

举报
Linux猿 发表于 2021/11/25 23:10:11 2021/11/25
【摘要】 🎈 作者:Linux猿 🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊! 🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬

🎈 作者:Linux猿

🎈 简介:CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

🎈 欢迎小伙伴们点赞👍、收藏⭐、留言💬


各位小伙伴们大家好呀,本篇文章将会为大家讲解下二叉排序树删除的内容,删除虽然不是常考点,但也需要掌握其原理,下面就开始我们的讲解吧!

一、重要知识点

(1)中序遍历二叉排序树可得到关键字的有序序列;

(2)每次在二叉排序树中插入新结点都将是二叉排序树上新的叶子结点;

(3)二叉排序树的存储结构一般选用二叉链表;

(4)二叉排序树也称为二叉查找树;

二、二叉排序树的删除

假设待删除的结点为cur,其父节点为parent,二叉树的删除遵循删除结点后需要保持二叉排序树的特性。

二叉树删除步骤:

1.若当前结点cur为叶子结点,即左右孩子为空,则直接删除该结点即可,删除该结点并不破坏二叉排序树的结构,需要使父节点parent的指向该结点的指针为空;

2.若当前结点cur的左孩子或右孩子为空,则直接让父结点parent指向cur结点的左孩子或右孩子即可;

3.若当前结点cur的左孩子和右孩子均不为空,有两种处理方式:

  • 让cur的左子树成为parent的左子树,cur的右子树为cur直接前驱结点的右子树;

  • 让cur的直接前驱(或直接后继)替代cur,然后从二叉排序树中删除cur的直接前驱(或直接后继);

PS:

直接前驱:小于cur结点data值并且值最大的节点 ,中序遍历cur前面的第一个结点;

直接后继:大于cur结点data值并且值最小的结点,中序遍历cur后面的第一个结点;

举例,假设有如下二叉排序树:

(1)删除叶子结点:如果删除值为43的结点,只需修改值为45结点的左孩子指针,然后释放值为43的结点即可;

(2)删除只有一个左孩子或右孩子的结点:如果删除值为45的结点,只需要将值为40结点的右孩子指针指向43结点即可,然后释放值为45的结点;删除值为200的结点同理;

(3)删除既有左孩子,又有右孩子的结点:如果删除值为50的结点,有两种方法:

  • 方法一、让值为30的结点成为值为100结点的左孩子,值为70的结点成为值为45结点的右孩子;

  • 方法二、让值为45的结点代替值为50的结点,45结点的左孩子43成为值为40结点的右孩子;


三、总结

二叉排序树经常考的是查找和插入的操作,删除操作也需要理解其原理。二叉排序树的平均查找长度是一个重要且经常考的考点,后面在讲平均查找长度的时候会一并讲解,大家有不理解的可以在评论区留言哦!


CSDN博客专家🏆,华为云享专家🏆,Linux、C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!

欢迎小伙伴们点赞👍、收藏⭐、留言💬


【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。