数据结构 —— 3 树(中)

1 二叉搜索树

1.1 什么是二叉搜索树

在这里插入图片描述
树动态性比较强,插入删除比较方便
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.2 二叉搜索树的查找操作

在这里插入图片描述
在这里插入图片描述
从编译角度来看,尾递归都可以用循环来写
在这里插入图片描述
要让树尽可能平衡,也就是平衡二叉树
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

1.3 二叉搜索树的插入

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
改为return后和查找很像
在这里插入图片描述
在这里插入图片描述

1.4 二叉搜索树的删除

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
左子树的最大元素一定没有右儿子
右子树的最小元素一定没有左儿子
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2 平衡二叉树

2.1 什么是平衡二叉树

在这里插入图片描述
(b)的效果较好
如何衡量平衡?

  • 左右2边高度差不多
  • 左右2边节点数差不多

在这里插入图片描述
上面的图:

  • 第一个 结点3左2右0
  • 第三个 结点7左3右1

在这里插入图片描述
在这里插入图片描述
(高度指路径的长度)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.2 平衡二叉树的调整

插入一个结点后可能会使原来平衡的二叉树不平衡了,所以要调整

RR旋转

在这里插入图片描述
因为BL 的值比A大比B小所以挂到A右子树
示例1:
在这里插入图片描述
做RR旋转:
在这里插入图片描述
实例2:
在这里插入图片描述
也是插在右子树的右子树上,所以也要做RR旋转
在这里插入图片描述

扫描二维码关注公众号,回复: 12596400 查看本文章

LL旋转

插在左子树的左子树上(左右孩子节点都可以)
被破坏者不一定就认准了根节点
也可以不是,虽然根节点也被破环了
在这里插入图片描述

LR旋转

插在左子树的右子树(左右孩子皆可)
在这里插入图片描述
找ABC中的一个中间值,A>C>B,即C放到根节点
在这里插入图片描述
错选B应选C
如果把6认为是被破坏点,则LL后还是不平衡的
所以要把1认为是被破坏点

RL旋转

在这里插入图片描述
例:
在这里插入图片描述
Mar被破环了,Jan没被破环,进行LR旋转
在这里插入图片描述
在这里插入图片描述
May被破环了,进行RR旋转
在这里插入图片描述
插入Sept依旧平衡
在这里插入图片描述
也就是说动那个结点前要先计算平衡因子
在这里插入图片描述
在这里插入图片描述

3 小白专场:是否同一棵二叉搜索树

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2. 先比较根节点(即第1个值),然后就变为了比较左右子树
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
flag:判断一个序列是不是跟树一致。如果某个节点没被访问过,则flag设为0,被访问过设为1。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
3,然后是2,在3 1 4 2构造的树里找,发现3和2之间隔了一个1没有出现过,所有是不一致的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
读到2check(T,V)=0就return 0了,后面的4,1会被当成下一个序列
在这里插入图片描述
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_42713936/article/details/105648266
今日推荐