跳到主要内容
2022-07-01
2 分钟
...
编程

文章摘要

这篇博文由博主撰写,系统介绍了二叉树的基本概念、性质、存储结构、遍历方法、普通树转换为二叉树的步骤以及二叉树形态计数的递推公式。

二叉树 binary tree,BT

介绍

  • 一种特殊的树形结构,是度数为 2 的树。即二叉树的每个节点最多具有两个子节点,每个节点的字节点分别称为左孩子、右孩子,子树则为左子树,右子树。
  • 二叉树可以为空且一定有序。
  • 在二叉树的第 i 层上至多有 2i个节点 (i>=0)。
  • 深度为 m 的二叉树上至多有 12m+112=2m+11\frac{1-2^{m+1}}{1-2}=2^{m+1}-1 个节点 (m>=0),一棵深度为 m 且有 2m+112^{m+1}-1 个节点的二叉树被称为满二叉树。
  • 每一个节点都与深度为 m 的满二叉树中编号为 1~n 的节点一一对应的深度为 m,有 n 个节点的二叉树被称为完全二叉树。
  • 对于任意一棵二叉树,若其有 n0个叶节点,n2个度为 2 的节点,则一定有 n0=n2+1。
  • 具有 n 个节点的完全二叉树的深度是 floor(log2n)floor\left( \log _2n \right)
  • 在有 n 个节点的完全二叉树中,对于编号为 i 的节点:
    • i=1i=1 ,则其无父节点,为根节点,否则其父节点编号为 floor(i2)floor\left( \frac{i}{2} \right)
    • 2i>n2i>n ,则 i 为叶节点,否则其左孩子的编号为 2i。
    • 2i<n<2i+12i<n<2i+1 ,则 i 无右孩子,否则其右孩子的编号为 2i+1。

如下图即二叉树示意图:

存储结构

单链表结构

CPP
struct node {
    int data; //数据域
    node* lc, rc; //分别指向左孩子于右孩子
};
struct bt {
    node* root;
}t;

与树一样,其实就是孩子表示法。

双链表结构

CPP
struct node {
    int data; //数据域
    node* lc, rc; //分别指向左孩子于右孩子
    node* father; //指向父节点
};
struct bt {
    node* root;
}t;

同理,其实就是父亲孩子表示法。

遍历

  • 先序遍历(输出 -> 左孩子 -> 右孩子)
  • 中序遍历(左孩子 -> 输出 -> 右孩子)
  • 后序遍历(左孩子 -> 右孩子 -> 输出)

普通树转二叉树

  1. 对于每一个节点,去除除最左边的树枝之外的所有树枝。
  2. 从最左边的节点开始,依次次将同层的每个兄弟节点横向相连。
  3. 以根节点为中心,将图形顺时针旋转约 45°。

如下图所示:

树的计数

具有 n (n>=1 且 n 为整数) 个节点的二叉树的种类的数量可以用下方的函数来表示:

f(n)={i=0n1f(i)f(ni1)(n>1)1(0n1)f\left( n \right) =\begin{cases} \sum_{i=0}^{n-1}{f\left( i \right) \cdot f\left( n-i-1 \right)}& \left( n>1 \right)\\ 1& \left( 0\leqslant n\leqslant 1 \right)\\ \end{cases}

题外话

这是第二篇学习笔记,上一篇可以点击这里查看。

学习笔记——二叉树
作者
序炁
发布于
2022-07-01
更新于
2022-07-01
许可协议
BY - 署名NC - 非商业性使用SA - 相同方式共享
QQ空间微博豆瓣XFacebookLinkedIn复制链接