数据结构与算法之美-二叉树-极客时间学习笔记

树是一种二维的数据结构,每个节点后面跟着不止1个后续节点,树与图的区别是,树沿着链接走下去,不会走回头路。走回头路了就是图。

二叉树是指最多只有2个分叉的树结构。满二叉树,叶子节点全都在最底层,除了叶子节点之外,每个节点都有左右两个子节点。完全二叉树,叶子节点都在最底下两层,最后一层的叶子节点都靠左排列,并且除了最后一层,其他层的节点个数都要达到最大。

说到完全二叉树,要介绍下树的两种存储方式,一种是基于指针的链式存储,另一种是利用数组的顺序存储法。可以看到完全二叉树就特别适合用数组进行存储,左子树是2i,右子树是2i+1。而非完全二叉树就会浪费特别多的空间。

二叉树的遍历分为前序遍历,中序遍历和后序遍历,这里都是指父节点的遍历顺序,分别是排在第一个,第二个,或者第三个。除此之外还有一种层序遍历,先把每一层的元素遍历完成,再遍历下一层,层序遍历一般是利用队列数据结构。

二叉查找树,在树中的任意一个节点,其左子树中的每个节点的值,都要小于这个节点的值,而右子树节点的值都大于这个节点的值。注意是子树的每个节点,而不仅是左右子树。二叉查找树的中序遍历会输出有序数据序列。如果二叉查找树有重复数据,可以将相同数据存在同一个节点,也可以当成大于的情况进行操作。

二叉查找树的查找操作,是通过不断的与节点比较,小于该节点就下沉到左子树,大于该节点则下沉到右子树。

二叉查找树的插入操作与查找类似,也是不断比较,子树留空则放置在子树位置,不然就继续下潜到下一层。

二叉查找树的删除操作分三种情况:

1、如果要删除的节点没有子节点,直接将父节点指向该删除节点的指针为null;

2、如果要删除的节点只有一个子节点,我们只需要更新父节点中,指向要删除节点的指针,让它指向要删除节点的子节点。

3、如果要删除的节点有两个子节点,需要找到这个节点右子树中的最小节点,把它替换到要删除的节点。

二叉查找树虽然很高效,但其操作上跟树的高度相关的,经过多次插入、删除操作后数据结构可能会退化。这里就引入平衡二叉查找树的说法,严格定义是任意节点的左右子树高度相差不超过1。虽然严格的平衡二叉查找树可以保证性能不发生退化,但其调整过程也是会消耗资源,所以实际应用中往往不会是利用严格定义的平衡二叉查找树,比如红黑树。

红黑树的定义:

  • 根节点是黑色的;
  • 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据;
  • 任何相邻的节点都不能同时为红色,也就是说,红色节点是被黑色节点隔开的;
  • 每个节点,从该节点到达其可达叶子节点的所有路径,都包含相同数目的黑色节点;

平衡就代表着性能不会退化太严重,近似于高度维持\log _{2}^{n}。可以通过简单证明,去除所有红色节点后,高度小于\log _{2}^{n}。加上红色节点,因为两个相邻节点不能同时为红色,这样加上红色节点后高度也一定是小于\2log _{2}^{n}

红黑树的实现这里就不记录,实在是太难,还是从应用上了解红黑树这个数据结构就足够,让我们自己编码实现红黑树的机会也不多。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值