数据结构与算法题目总结(四)二叉树篇

8. 二叉树

    8.1什么是二叉树?

        二叉树是每个结点最多有两个子树的树结构。子树有左右之分,其次序不能任意颠倒。

    8.2二叉树的特点:

        (1)二叉树第n层有最多 2^(n-1) 个节点

        (2)高度为n的二叉树最多有 2^n -1 个节点

        (3)对任何一棵二叉树,如果度为0的结点数为m, 度为2的结点数为n, 则m = n + 1。(度:结点的子结点个数被称之为度)

    8.3二叉树分类:

        完全二叉树:最后一层叶子结点都靠左对齐。

        完满二叉树:只要有子结点,就必然是有两个

数据结构与算法题目总结(四)二叉树篇_第1张图片

    8.4二叉树的顺序存储:

        一棵完全二叉树顺序存储数组 [1=>'A',2=>'B',3=>'C',4=>'D',5=>'E',6=>'F',7=>'G',8=>'H',9=>'I',10=>'J'] 如下图所示。

数据结构与算法题目总结(四)二叉树篇_第2张图片

        针对数组 [1=>'A',2=>'B',3=>'C',5=>'E',6=>'F',7=>'G',10=>'J'] ,采用顺序存储的样子如下图所示。此时我们可以发现顺序存储结构中已经出现了空间浪费的情况。因此,顺序存储一般适用于完全二叉树。

数据结构与算法题目总结(四)二叉树篇_第3张图片

    8.5二叉树的前中后序遍历:

数据结构与算法题目总结(四)二叉树篇_第4张图片

    8.6二叉链表

        顺序存储可能会出现空洞,那么我们可以考虑采用链式存储。由二叉树定义可知,二叉树的每个结点最多有两个孩子。因此,可以将结点数据结构定义为一个数据和两个指针域。如下图所示

数据结构与算法题目总结(四)二叉树篇_第5张图片

    8.7线索二叉树

        下图的二叉树一共有10个结点,空指针^却有11个。这些空指针造成了空间浪费

数据结构与算法题目总结(四)二叉树篇_第6张图片

        于是我们定义了规则:

        若结点的左子树为空,则该结点的左孩子指针指向其前驱结点。

        (前驱节点:对一棵二叉树进行中序遍历,遍历后的顺序,当前节点的前一个节点为该节点的前驱节点)

        若结点的右子树为空,则该结点的右孩子指针指向其后继结点。

        (后继节点:对一棵二叉树进行中序遍历,遍历后的顺序,当前节点的后一个节点为该节点的后继节点)

        指向前驱和后继的指针称为线索。将一棵普通二叉树以某种次序遍历,并添加线索的过程称为线索化。

数据结构与算法题目总结(四)二叉树篇_第7张图片
这是一个线索化的二叉树

        一个新的问题:我们如何区分一个结点的lchild指针是指向左孩子还是前驱结点呢?新添标志位ltag,rtag

        ltag为0时,指向左孩子,为1时指向前驱

        rtag为0时,指向右孩子,为1时指向后继

数据结构与算法题目总结(四)二叉树篇_第8张图片
在上图的基础上追加了标志位

    8.8堆

        堆是一个树形结构,堆的底层是一棵完全二叉树(一棵完全二叉树的数组对象)。

        与完全二叉树不同的就是堆的左子节点的值和右子节点的值没有特定的大小关系。并且堆的父节点要么是最大值,要么是最小值(这要看是最大堆还是最小堆)

数据结构与算法题目总结(四)二叉树篇_第9张图片

    8.9堆的代码实现:

        准备一个swap方法

数据结构与算法题目总结(四)二叉树篇_第10张图片
数据结构与算法题目总结(四)二叉树篇_第11张图片
数据结构与算法题目总结(四)二叉树篇_第12张图片

你可能感兴趣的:(数据结构与算法题目总结(四)二叉树篇)