- 抽象定义
- CFG文法
- 具体表示
- 基本操作
- 性质
抽象定义
二叉树是一个抽象的数学概念。它的定义是递归的
- 一棵二叉树可以是一个外部节点,
- 一棵二叉树可以是内部节点,连接到一对二叉树,分别是它的左子树,和右子树。
这个抽象定义描述了二叉树的逻辑结构和组成规则。
CFG文法
根据上一节给出的二叉树的定义,我们给出对应的上下文无关文法。
假设
- 非终端符号 T T T 表示一棵二叉树。
- 终端符号
e
表示一个抽象的外部节点。 - 终端符号
i
表示一个抽象的内部节点。
那么,对应的产生式规则如下:
- 基本情况:
T
→
e
T\to e
T→e,对应一棵二叉树可以是外部节点
e
。 - 构造器情况:
T
→
i
T
T
T\to iTT
T→iTT,对应一棵二叉树可以是一个内部节点
i
,连接到一个左子树和一个右子树。
最后,得到完整的CFG文法:
- 终端符号集 Σ = { e , i } \Sigma=\{e,i\} Σ={e,i}
- 非终端符号集 V = { T } V=\{T\} V={T}
- 开始符号 S = T S=T S=T
- 产生式规则集 P = { T → e , T → i T T } P=\{T\to e, T\to iTT\} P={T→e,T→iTT}
具体实现
标准的双链接结构:
- 使用结构体表示节点,包含数据
Item
和两个链接 (link
)(通常是指针)。 - 链接分别指向左子节点/子树和右子节点/子树。
- 空链接 (Null links) 表示外部节点。
typedef struct node* link; struct node { Item item; link l; link r; };
其他表示方法包括:
- 添加父链接:增加指向父节点的链接。
- 使用数组和索引作为链接:将节点存数组,用索引代替指针。
- 二进制字符串表示法,见练习5.62
基本操作
- 在底部插入一个新节点: 替换空链接。
- 删除一个叶子: 用空链接替换指向叶子的链接。
- 组合两棵树: 创建新根连接两棵树。
性质
二叉树和有序树可以相互转换
因为二叉树本身就是一棵有序树,所以只需关注如何将有序树转换为一棵二叉树。
每遇到一个节点,都要回答两个问题:
- 它有最左的孩子节点吗?如果有,则把最左孩子节点作为它的左孩子。
- 它有右兄弟节点吗?如果有,则把右兄弟节点作为它的右孩子。
示例1
示例2