树和二叉树(1)——概念

树的定义与基本操作

树描述的是一种层次结构,如下图所示,下图中节点 A 为树的根节点,一颗树有且仅有一个根节点。树的定义是递归的,当树节点数量大于 1 时,除根结点外的其他节点构成根节点的子树。
树的层次结构

树中的一些概念

  1. 节点:表示树中的元素项。
  2. 节点的度数:节点拥有的子树个数。
  3. 树的度数:树中最大的节点度数。
  4. 叶子节点:度数为 0 的节点。
  5. 树的层次:根节点为第一层,根节点的子节点为第二层,以此类推。
  6. 树的深度:数中节点最大层次数。
  7. 子节点、父节点、兄弟节点、堂兄弟节点(父节点在同一层)。
  8. 森林: n n n 棵树的集合称为森林( n > 1 n > 1 n>1) 。

二叉树

定义:任意节点的子数个数都不超过两个的树称为二叉树。二叉树区分左右,二叉树有五种基本形态,如下图所示。
二叉树基本形态

1. 满二叉树

  • 定义:深度为 k k k 且节点数为 2 k − 1 2^{k-1} 2k1 的二叉树称为满二叉树。

  • 满二叉树特点
    a. 只有度为 0 和 2 的节点
    b. 二叉树中每一层节点数都达到最大
    c. 叶节点只出现在最底层(第 k k k 层)

2. 完全二叉树

  • 定义: 从满二叉树最底层最右叶子节点开始从右向左,自下而上删除 n n n 个节点( n < 2 k − 1 n < 2^{k-1} n<2k1) 之后的树称为完全二叉树,一个完全二叉树的例子如下图所示。
    一个完全二叉树示例

  • 二叉树的存储结构,多采取链式存储,也可采用顺序存储。链式存储有两种实现方式,一种是二叉链表,每个节点有两个指针,分别指向左右孩子;另一种为三叉链表,在二叉链表基础上增加一个指针域指向父节点。

  • 二叉树的遍历
    a. 前序遍历:先根节点然后左子树,最后右子树。
    b. 后序遍历:先左子树然后右子树,最后根节点。
    c. 中序遍历:先左子树然后根节点,最后右子树。
    d. 层次遍历:从左往右,从上向下,一层一层遍历。

    以上面示例中的三层满二叉树为例,这四种遍历方式的顺序分别为:
    a. 前序遍历:A→B→D→E→C→F→G
    b. 后序遍历:D→E→B→F→G→C→A
    c. 中序遍历:D→B→E→A→F→C→G
    d. 层次遍历:A→B→C→D→E→F→G

树与二叉树

  1. 树的孩子兄弟存储结构,每个节点存在两个指针域,一个指向第一个孩子节点,一个指向第一个兄弟节点,如下图所示。
    孩子兄弟链表

  2. 树和二叉树的互相转化
    由于孩子兄弟存储结构是二叉链表形式,与二叉树的二叉链表存储结构类似,只是指针域代表的含义不同,所以二叉树和树之间可以进行相互转换。

    以 1 中的孩子兄弟链表为例,改变其指针域的含义,用左孩子指针代替长子节点指针,右孩子指针代替兄弟指针,就可以将孩子兄弟链表存储的树转换为一棵二叉树,如下图所示,由于根节点没有兄弟节点,所以由孩子兄弟链表存储的树转换得来的二叉树没有右子树。
    左右孩子二叉树

  3. 由于二叉树和树可以互相转换,所以树的遍历可借助于二叉树的遍历,分为前序(也叫先根)遍历、中序遍历、后序(也叫后根)遍历、层次遍历。

哈夫曼树与哈夫曼编码

堆排序算法

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页