二叉树复习

其实这篇文章曾经也在初赛复习里。。

一个比较好的博客

  • 满二叉树:比较简单,就是一颗满的二叉树 废话

  • 完全二叉树:也比较简单,就是除了最后一层,上面都是满的,而最后一层的叶子结点都集中在左边。

  • 平衡二叉树:是一颗空树或者对于每一个节点,他的左子树和右子树高度差不超过1,矮矮胖胖好身材

  • 二叉搜索(查找、排序)树,满足以下条件:

  1. 左子树上的所有节点值均小于根节点值
  2. 右子树上的所有节点值均不小于根节点值
  3. 左右子树也满足上述两个条件
  4. 对二叉树进行中序遍历时,其输出是一个有序数组

但它有一个问题,如果想要卡的话可以把这棵树卡成一条链,所以就要用到二叉平衡树。

  • 哈夫曼树:给定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已经没有叶子结点就停止。

原文地址:https://www.cnblogs.com/tangzhiyang/p/11800340.html