5.2 二叉树的概念

基础概念

相关提炼内容见 binary-tree

二叉树的定义

每个结点至多只有两棵子树,且子树有左右之分

几个特殊的二叉树

满二叉树:假设高度为 3,那么满二叉树的结点数就是(1+2+4=7)7 个,每层都是满的

     1
    / \
   2   3     <== 这就是满二叉树
  / \ / \
 4  5 6  7

完全二叉树:其实就是满二叉树删除最后 x 个结点,比如一颗完全二叉树的高度是 3,下图都是完全二叉树

     1           1           1
    / \         / \         / \
   2   3       2   3       2   3
  / \ /       / \         /
 4  5 6      4  5        4

二叉排序树:对于任何一个结点,左子树比它小,右子树比它大

     5           5             5
    /           / \           / \
   3           3   7         3   7   ......好多好多
  /           /     \       /   /
 1           1       10    1   6

平衡二叉树:可以理解为更加严格的二叉排序树

     5       👈这是二叉排序树😋                3
    /        但不是平衡二叉树                  / \
   3         你可以理解为左轻右重             1   5
  /          很不美观,调整后👉
 1

关于平衡二叉树其实有更加严格的定义,请自行查阅

二叉树的性质

TODO 之前的笔记晦涩难懂,要重新写一下

二叉树的存储结构

  • 顺序存储结构
    • 完全二叉树和满二叉树采用顺序存储比较合适
    • 对于一般的二叉树,需要添加并不存在的空结点
    • 结点类型定义
#define MAXSIZE 100
typedef TElemType SqBiTree[MAXSIZE];
SqBiTree bt;
  • 链式存储结构

二叉链表

二叉链表的结点类型定义

typedef struct BiTNode{
    TElemType data;
    struct BiTNode *lchild,*rchild;
}BiTNode, *BiTree;

思考:在含有 n 个结点的二叉链表中,含有多少个空链域??→n+1 个空链域

再来看看三叉链表,它的结点类型定义如下

typedef struct TriNode{
  TElemType data;
  struct TriNode *lchild,*rchild,*parent;
}TriNode, *TriTree;

看着很吓人,其实仔细阅读并不难