二叉树的顺序存储结构
二叉树的顺序存储结构就是用一维数组存储二叉树中的节点,并且节点的存储位置(下标)应能体现节点之间的逻辑关系——父子关系。
普通二叉树需按照完全二叉树的编号方式编号,然后以完全二叉树的形式存储到一维数组中,造成很多浪费,故二叉树的顺序存储结构一般仅存储完全二叉树.
二叉树的链式存储表示
二叉链表
基本思想
令二叉树的每个节点对应一个链表节点,链表节点除了存放与二叉树节点有关的数据信息外,还要设置指示左右孩子的指针。
结构
typedef struct BiTNode{ // 二叉链表
TElemType data; // 数据域
struct BiTNode *lchild, *rchild; //左右孩子指针
} BiTNode, *BiTree;
特点
空间浪费: 具有n个节点的二叉链表中,有n+1个空指针
三叉链表
基本思想
在二叉链表的节点上多加一个双亲指针.便于找到此节点的双亲.
结构
typedef struct TriTNode { // 三叉链表
TElemType data; // 数据
struct TriTNode *lchild, *rchild; // 左右孩子指针
struct TriTNode *parent; //双亲指针
} TriTNode, *TriTree;
线索链表
这个后续线索二叉树会讲到,此处按下不表
二叉树遍历
遍历实现
具体遍历方法已在博客中书写过,不再重复讲述
传送门: 二叉树遍历
由遍历序列求二叉树
1.根据前序序列的第一个元素建立根节点;
2.在中序序列中找到该元素,确定根节点的左右子树的中序序列;
3.在前序序列中确定左右子树的前序序列;
4.由左子树的前序序列和中序序列建立左子树;
5.由右子树的前序序列和中序序列建立右子树。
(4,5条基本就是递归求解的意思)
线索二叉树
概念
线索:将二叉链表中的空指针域指向前驱节点和后继节点的指针被称为线索;
线索化:使二叉链表中节点的空链域存放其前驱或后继信息的过程称为线索化
线索二叉树:加上线索的二叉树称为线索二叉树。
LTag
lchild指向该结点的左孩子
lchild指向该结点的前驱结点
RTag
rchild指向该结点的右孩子
rchild指向该结点的后继结点
typedef enum { Link, Thread } PointerThr; // 左右孩子指针(0) or 线索(1)
typedef struct BiThrNod {
TElemType data; // 数据域
struct BiThrNode *lchild, *rchild; // 左右指针
PointerThr LTag, RTag; // 左右标志
} BiThrNode, *BiThrTree;
线索化的实质就是将二叉链表中的空指针改为指向前驱或后继的线索。由于前驱和后继信息只有在遍历该二叉树时才能得到,所以,线索化的过程就是在遍历的过程中修改空指针的过程。