二叉树复习

Posted tangzhiyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树复习相关的知识,希望对你有一定的参考价值。

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

一个比较好的博客

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

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

  • 平衡二叉树:是一颗空树或者对于每一个节点,他的左子树和右子树高度差不超过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已经没有叶子结点就停止。

以上是关于二叉树复习的主要内容,如果未能解决你的问题,请参考以下文章

《数据结构》复习之二叉树

Java复习--树

Java复习--树

二叉树复习

数据结构期末复习——树与二叉树一些知识点

数据结构复习笔记——二叉树的常用接口的实现(c语言)