数据结构篇-二叉树

  • 抽象定义
  • CFG文法
  • 具体表示
  • 基本操作
  • 性质

抽象定义

二叉树是一个抽象的数学概念。它的定义是递归的

  • 一棵二叉树可以是一个外部节点,
  • 一棵二叉树可以是内部节点,连接到一对二叉树,分别是它的左子树,和右子树。

这个抽象定义描述了二叉树的逻辑结构和组成规则。

CFG文法

根据上一节给出的二叉树的定义,我们给出对应的上下文无关文法。

假设

  • 非终端符号 T T T 表示一棵二叉树。
  • 终端符号 e 表示一个抽象的外部节点。
  • 终端符号 i 表示一个抽象的内部节点。

那么,对应的产生式规则如下:

  • 基本情况: T → e T\to e Te,对应一棵二叉树可以是外部节点e
  • 构造器情况: T → i T T T\to iTT TiTT,对应一棵二叉树可以是一个内部节点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={Te,TiTT}

具体实现

标准的双链接结构:

  • 使用结构体表示节点,包含数据 Item 和两个链接 (link)(通常是指针)。
  • 链接分别指向左子节点/子树和右子节点/子树。
  • 空链接 (Null links) 表示外部节点。
    typedef struct node* link;
    
    struct node {
    	Item item;
    	link l;
    	link r;
    };
    

其他表示方法包括:

  • 添加父链接:增加指向父节点的链接。
  • 使用数组和索引作为链接:将节点存数组,用索引代替指针。
  • 二进制字符串表示法,见练习5.62

基本操作

  • 在底部插入一个新节点: 替换空链接。
  • 删除一个叶子: 用空链接替换指向叶子的链接。
  • 组合两棵树: 创建新根连接两棵树。

性质

二叉树和有序树可以相互转换

因为二叉树本身就是一棵有序树,所以只需关注如何将有序树转换为一棵二叉树。

每遇到一个节点,都要回答两个问题:

  • 它有最左的孩子节点吗?如果有,则把最左孩子节点作为它的左孩子。
  • 它有右兄弟节点吗?如果有,则把右兄弟节点作为它的右孩子。

示例1
有序树转二叉树示例1
示例2
有序树转二叉树示例2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值