数据结构:树的同构

有一种严格同构:根左子树右子树三者相同

在这里左右子树可以交换位置

判断指数是否相同

注意**不要求根结点作为第一个数据输入 

如第二张图的例子,G第一个输入但是G不是根结点

输入格式:自身信息+左儿子+右儿子

问题来了:怎么判断根结点(关键问题)

 需要考虑三个问题:
 

1.二叉树表示一般用链表或者数组,这里研究怎么用数组表示

先考虑第一个问题: 

若用链表表示一般用两个指针,一个指向left一个指向right

 用数组表示:按照完全二叉树的组织形式来表示一个二叉树

缺少的结点在数组中空出来 

基本的存储用数组,把需要的结点信息存储在数组中,   但左右儿子用类似链表的方式来表示 ,有一个 数据来指示左儿子右儿子在哪里  

物理上的存储是数组但是他的思想是一种链表的思想。

数组里的每个分量是一个结构, 每一列是数组的一个分量,这是一个结构。结构包含三个信息,一个ABCD表示这个结点本身的信息

**注意left right不是指向左儿子右儿子指针,而是指向左儿子右儿子位置的下标

数组正常的下标是从0开始的,怎么表示指向一个空的结点?用-1

因为left right不是指针,当它指向的左右指针空缺时,不能指向NULL

NULL在stdlb.h中的定义是0,空指针是0,它的值实际上是0,在这里不能有NULL(因为0也是下标!!!)

为了区分传统空指针的NULL,这里定义了Null

#define Null -1;

二叉树的表示不是唯一的,且ABCD的顺序可以改变

因为这种表示方法的灵活性,所以它具有链表的灵活性,但是它是使用数组进行表示的,所以称为“静态链表”

怎么确定根结点?看数组所有的下标中哪个没有在left right中出现

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值