赞
踩
今天来聊聊这个二叉树
我们从二叉排序树讲起,然后我们聊聊平衡二叉树
首先,对于一颗二叉排序树来讲,它满足以下的性质。
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++ } }
那么说完了二叉排序树,那么顺便说下二叉平衡树。
你有时候会不会很费解,我们为什么引入 平衡二叉树呢。
当设计出二叉排序树的时候,所有人都觉得,喔,很牛逼,查得很快了。
但是有这么一种情况,当没有右子树,或者没有左子树的时候。
那么咋整呢,聪明机智的前辈们想,只要我树的高度降低下来了。它不就快了吗。
由此,引入了平衡二叉树的概念
我们将一颗二叉树的左子树的高度减去右子树的高度作为该结点的平衡因子,并且规定,平衡因子只有0,+1,-1三个值。
看似很美好,很破费(perfect。现在我插入一个小岳岳,
咋整呢,这肯定不符合我平衡二叉树的定义
那咋办,调整。
那么,在插入后失去平衡进行调整,一共有以下四种情况。
在结点A的左孩子(L)的左子树(L)上插入了新的结点,A的平衡因子由1 增至2,
导致A为根节点的子树失去平衡,需要进行一次向右的旋转操作。
在结点A的右孩子(R)的右子树(R)上插入了新的结点,A的平衡因子由1 增至2,
导致A为根节点的子树失去平衡,需要进行一次向左的旋转操作。
歇逼了,看不懂
不要怕,他只是名字起得比较牛逼
可能这样说不是很直观,我们来看道题目实战一下
依次把34 23 15 98 115 28 107插入初始为空的平衡二叉树
画出最后得到的平衡二叉树
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
先来看A,从根节点95出发,走到它的左孩子结点22,22作为左子树比95小,没问题,继续走。走到91,画出91作为22的右子树,91比22大,比95小,没有问题。
继续走。
直到走到94,94作为24的右子树,没有问题,但是,94作为91的左孩子,它比根节点91大。
所以明显A错
2.一个具有5层结点的AVL最少有几个结点?
能满足5层AVL的最少节点,从根节点开始计算平衡因子,依次画出各个子树。
差不多长这样。
3. 若将关键字1,2,3,4,5,6,7依次插入初始为空的平衡二叉树T中,
则T中平衡因子为0的分支结点的个数为__ 3___
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。