平衡二叉树(AVL)原来这么简单,看完我就不淡定了

今天来聊聊这个二叉树
我们从二叉排序树讲起,然后我们聊聊平衡二叉树

二叉排序树

首先,对于一颗二叉排序树来讲,它满足以下的性质。
1.左子树的所有结点 都 小于 根节点
2.右子树的所有结点 都 大于 根节点
3.左右子树本身也是一颗 二叉排序树

那么很明显,这是递归的定义,根据上述定义,我们可以很轻松的画出一颗二叉排序树来。

那么我们该怎么画呢。
从根节点开始向下找,如果比它大,则去右子树找,反之则去左子树找。当找到了自己的位置,也就是找到了一个左子树/右子树为空的点,则插入。

伪代码如下

boolean insert(Tree &T,int k){	//插入一个值为k的结点
	if(T==null){
		T=(Tree)malloc(sizeof(k))
		T.key=k
		T.rightchild=null
		T.leftchild =null
		return true
	}else if(K==T.key){
		return false		//树中已有结点,插入失败
	}else if(K>T.key){
		return insert(T.rightchild,k)	//如果k比当前结点大,说明k位于这个结点的右子树上
	}else 
		return insert(T.leftchild,k)	//如果k比当前结点小,则说明k位于这个结点的左子树上	
}

void createTree(Tree &T,int str[]){		//创建一颗二叉排序树
	T=null
	int i=0
	while(i<str.length){
		insert(T,str[i])
		i++
	}
}

那么说完了二叉排序树,那么顺便说下二叉平衡树。

你有时候会不会很费解,我们为什么引入 平衡二叉树呢。

当设计出二叉排序树的时候,所有人都觉得,喔,很牛逼,查得很快了。
平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第1张图片

但是有这么一种情况,当没有右子树,或者没有左子树的时候。
平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第2张图片

那么咋整呢,聪明机智的前辈们想,只要我树的高度降低下来了。它不就快了吗。
平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第3张图片

由此,引入了平衡二叉树的概念

平衡二叉树

我们将一颗二叉树的左子树的高度减去右子树的高度作为该结点的平衡因子,并且规定,平衡因子只有0,+1,-1三个值。
平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第4张图片

看似很美好,很破费(perfect。现在我插入一个小岳岳,
平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第5张图片
平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第6张图片
咋整呢,这肯定不符合我平衡二叉树的定义
那咋办,调整。

二叉树的旋转

那么,在插入后失去平衡进行调整,一共有以下四种情况。

1.LL平衡(右单旋转):

插入位置:左孩子左子树 LL

在结点A的左孩子(L)的左子树(L)上插入了新的结点,A的平衡因子由1 增至2,
导致A为根节点的子树失去平衡,需要进行一次向右的旋转操作。
平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第7张图片

2.RR平衡(左单旋转):

插入位置:右孩子右子树 RR

在结点A的右孩子(R)的右子树(R)上插入了新的结点,A的平衡因子由1 增至2,
导致A为根节点的子树失去平衡,需要进行一次向左的旋转操作。
平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第8张图片

3.LR平衡旋转(先左后右双旋转)

插入位置:左孩子右子树 LR

歇逼了,看不懂
不要怕,他只是名字起得比较牛逼
平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第9张图片

4.RL平衡旋转(先右后左双旋转)

插入位置 右孩子左子树 RL

平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第10张图片

也就说,可以根据插入位置相对于根节点的位置,分为上述四种情况。而至于究竟是插入了C的左子树还是右子树,我们不关心。我们只关心节点A和它的孩子B。

需要注意的是

结点A并不一定是根节点,而是插入操作之后所影响到的祖先节点。

可能这样说不是很直观,我们来看道题目实战一下

依次把34 23 15 98 115 28 107插入初始为空的平衡二叉树
画出最后得到的平衡二叉树


平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第11张图片










1.对于下列关键字序列,不可能构成某二叉排序树中一条查找路径的序列是()。

A.95, 22, 91, 24, 94, 71
B.92, 20, 91, 34, 88, 35
C.21, 89, 77, 29, 36, 38
D.12, 25, 71, 68, 33, 34

平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第12张图片

先来看A,从根节点95出发,走到它的左孩子结点22,22作为左子树比95小,没问题,继续走。走到91,画出91作为22的右子树,91比22大,比95小,没有问题。
继续走。
直到走到94,94作为24的右子树,没有问题,但是,94作为91的左孩子,它比根节点91大。

所以明显A错

2.一个具有5层结点的AVL最少有几个结点?

能满足5层AVL的最少节点,从根节点开始计算平衡因子,依次画出各个子树。
平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第13张图片
差不多长这样。

3. 若将关键字1,2,3,4,5,6,7依次插入初始为空的平衡二叉树T中,
则T中平衡因子为0的分支结点的个数为__ 3___

平衡二叉树(AVL)原来这么简单,看完我就不淡定了_第14张图片

你可能感兴趣的:(二叉树,数据结构,算法)