树和森林,森林和二叉树的转换,树和森林的遍历

1 树的存储结构

1)双亲表示法 用一组连续的存储空间来存储树的结点,同时在每个结点中附加一个指数器(整数域),用以指示双亲结点的位置(下标值)。

typedef int ElemType;
typedef struct PTNode {
    ElemType data;
    int parent;
} PTNode;
typedef struct {
    PTNode nodes[MAXSIZE];
    int root;//根结点位置
    int num;//结点数
} Ptree;

利用了任一结点的父结点唯一的性质。可以方便地直接找到任一结点的父结点,求结点的子结点时需要扫描整个数组。


2)孩子链表表示法 树中每个结点有多个指针域,每个指针指向其一颗子树的根结点。有两种结点结构
①定长结点结构
指针域的数目就是树的度。其特点是:链表结构简单,但指针域的浪费明显。在一棵有n个结点,度为k的树中必有n(k-1)+1个空指针域。
②不定长结点结构
树中每个结点的指针域数量不同,是该结点的度。没有多余的指针域,操作不便。
③复合链表结构
对于树中的每个结点,其孩子结点用头结点的单链表表示。
n个结点的树有n个(孩子)单链表(叶子结点的孩子链表为空),而n个头结点又组成一个线性表且以顺序存储结构表示。

typedef struct listNode {
    int childNo;//孩子结点编号
    struct listNode *next;
} CTNode;//表结点结构
typedef struct {
    ElemType data;
    CTNode *firstChild;
} HNode;//头结点结构
typedef struct {
    HNode nodes[MAXSIZE];
    int root;//根结点位置
    int num;//结点数
} CLinkList;//头结点结构


3)孩子兄弟表示法 这是一种常用的存储结构。在树中,每个结点除其信息域外,再增加两个分别指向该结点的第一个孩子结点和下一个兄弟结点的指针。 两个指针域:分别指向结点的第一个子结点和下一个兄弟结点。

typedef int ElemType;
typedef struct CSnode {
    ElemType data;
    struct CSnode *firstchild, *nextsibing;//第一个孩子结点,亲兄弟结点
} CSNode;
孩子兄弟表示法

2 森林和二叉树的转换

由于二叉树和树都可用二叉链表(孩子兄弟表示法)作为存储结构,对比各自的结点结构可以看出,以二叉链表作为媒介可以导出树和二叉树之间的一个对应关系。
从物理结构来看,树和二叉树的二叉链表是相同的,只是对指针的逻辑解释不同而 已。
从树的二叉链表表示的定义可知,任何一棵和树对应的二叉树,其右子树一定为空。(因为根结点只有孩子,没有兄弟)



1)树转换为二叉树
对于一棵无序树,树中结点的各孩子的次序是无关紧要的,而二叉树中结点的左、右孩
子结点是有区别的。为避免发生混淆,约定树中每一个结点的孩子结点按从左到右的次序顺 序编号。将一棵树转换为二叉树的方法是:
(1)树中所有相邻兄弟之间加一条连线;
(2)对树中的每个结点,只保留它与第一个孩子结点之间的连线,删去它与其它孩子结点之间的连线;
(3)以树的根结点为轴心,将整棵树顺时针转动一定的角度,使之结构层次分明。可以 证明,树作这样的转换所构成的二叉树是唯一的。 由转换过程可以看出,在二叉树中,左 分支上的各结点在原来的树中是父子关系,而右分支上的各结点在原来的树中是兄弟关系。
由于树的根结点没有兄弟,所以变换后的二叉树的根结点的右孩子必为空。
事实上,一棵树采用孩子兄弟表示法所建立的存储结构与它所对应的二叉树的二叉链表
存储结构是完全相同的。
举例:将下列树转换成二叉树。



转换过程:
加线:在兄弟之间加一连线;

抹线:对每个结点,除了其左孩子外,去除其与其余孩子之间的关系;

旋转:以树的根结点为轴心,将整树顺时针转 45°


2)二叉树转换为树的过程
(1) 加虚线。若某结点i是其父结点的左子树的根结点,则将该结点i的右子结点以及 沿右子链不断地搜索所有的右子结点,将所有这些右子结点与 i 结点的父结点之间加虚线相 连。
(2) 去连线。去掉二叉树中所有父结点与其右子结点之间的连线。
(3) 规整化。将图中各结点按层次排列且将所有的虚线变成实线。


3)森林转换为二叉树
由森林的概念可知,森林是若干棵树的集合,只要将森林中各棵树的根视为兄弟,每棵树又可以用二叉树表示,这样,森林也同样可以用二叉树表示。


4)二叉树还原为森林
(1) 去连线。将二叉树的根结点与其右子结点以及沿右子结点链方向的所有右子结 点的连线全部去掉,得到若干棵孤立的二叉树,每一棵就是原来森林 F中的树依次对应的二叉树。
(2)将各棵孤立的二叉树按二叉树还原为树的方法还原成一般的树。


image.png

3 树和森林的遍历

1.树的遍历
(1)先序遍历:先访问根结点,然后依次先序遍历完每棵子树。
(2)后序遍历:先依次后序遍历完每棵子树,然后访问根结点。
由于不分左右子树,所以无中序遍历。


总结:对于一颗树的先序遍历等于转变为二叉树后的先序遍历;
对于一棵树的后序遍历等于转变为二叉树后的中序遍历。

2.森林的遍历
(1)先序遍历:按先序遍历树的方式依次遍历森林中的每棵树。
(2)中序遍历:按后序遍历树的方式依次遍历森林中的每棵树。(注意定义为中序遍历)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355