二叉树复习
其实这篇文章曾经也在初赛复习里。。
-
满二叉树:比较简单,就是一颗满的二叉树
废话 -
完全二叉树:也比较简单,就是除了最后一层,上面都是满的,而最后一层的叶子结点都集中在左边。
-
平衡二叉树:是一颗空树或者对于每一个节点,他的左子树和右子树高度差不超过1,
矮矮胖胖好身材 -
二叉搜索(查找、排序)树,满足以下条件:
- 左子树上的所有节点值均小于根节点值
- 右子树上的所有节点值均不小于根节点值
- 左右子树也满足上述两个条件
- 对二叉树进行中序遍历时,其输出是一个有序数组
但它有一个问题,如果想要卡的话可以把这棵树卡成一条链,所以就要用到二叉平衡树。
- 哈夫曼树:给定N个权值作为N个叶子结点,构造一棵二叉树,使该树的带权路径长度达到最小。简单来说就是在哈夫曼编码里面,每次选出现次数(权值)最小的两个点合并,然后将每一条树枝标上0和1,该点的编码就是从根节点到这个点的路径上的0,1串
感觉说了一堆废话
还是上图现实
手打堆也是考的比较多的内容,要记的熟练一些,特别是一些细节。
贴一点模板:
namespace Heap{
void insert(int x){
tre[++sz]=x;
int nw=sz;
while(nw>1){
int nxt=nw>>1;
if(tre[nxt]>tre[nw])swap(tre[nxt],tre[nw]);
else return;
nw=nxt;
}
}
void del(int x){
swap(tre[sz],tre[x]);
sz--;int nw=x;
while(nw*2<=sz){
int nxt=nw<<1;
if(nxt+1<=sz&&tre[nxt+1]<tre[nxt])nxt++;
if(tre[nxt]<tre[nw])swap(tre[nxt],tre[nw]);
else return;
nw=nxt;
}
}
}
再来一点例题:
- 小顶堆初始序列为 [0,3,2,5,7,4,6,8],在删除堆顶元素0之后,其结果是()。
A.[3,2,5,7,4,6,8]
B.[2,3,5,7,4,6,8]
C.[2,3,4,5,7,8,6]
D.[2,3,4,5,6,7,8]
答案:C 对小顶堆操作的理解
删掉0之后,先把8放到最上面[8,3,2,5,7,4,6],然后向下比较,第一个点的左右儿子编号是2、3,和2交换位置[2,3,8,5,7,4,6],再向下比较,左右儿子编号是6、7,和4交换位置[2,3,4,5,7,8,6],此时8已经没有叶子结点就停止。