
Java数据结构--树、森林和二叉树
发布日期:2021-05-07 20:56:50
浏览次数:23
分类:精选文章
本文共 1495 字,大约阅读时间需要 4 分钟。
一、树、森林和二叉树之间的转换
树或森林与二叉树之间存在一一对应的关系。任何一棵树或一个森林可唯一地对应到一棵二叉树;反之,任何一棵二叉树也能唯一地对应到一个森林或一棵树。
1.1 将树转化为二叉树
树中每个结点最多只有一个最左边的孩子(长子)和一个右邻的兄弟。按照这种关系很自然地就能将树转换成相应的二叉树,具体步骤是:
1)在所有兄弟结点之间加一连线; 2)对每个结点,除了保留与其长子的连线外,去掉该结点与其他孩子的连线。 示例:将图2.1
所示的树转换为二叉树。
根据树转二叉树的规则:第一步,加线;第二步:抹线;第三步:旋转。具体过程如
图2.2
所示。
注意:由于树根没有兄弟,故树转化为二叉树后,二叉树的根结点的右子树必为空。
1.2 将一个森林转换为二叉树
具体方法:
1)将森林中的每棵树变为二叉树; 2)因为转换所得的二叉树的根结点的右树均为空,故将各二叉树的根结点视为兄弟从左至右连在一起,就形成了一棵二叉树。
示例:将如
图2.3
所示的森林转化为二叉树![]()
1.3 二叉树到树、森林的转换
把二叉树转换成树和森林的方式是:若结点x是双亲y的左孩子。则把x的右孩子。右孩子的右孩子,…,都与y用连线连起来,最后去掉所有双亲到右孩子的连线。
示例:将
图2.4
所示的二叉树转换为树。![]()
二、树、森林的遍历
2.1 树的遍历
树的遍历通常有先根遍历和后根遍历两种方式。
1)先根遍历 先根遍历的定义为: 1、访问根结点; 2、按照从左到右的顺序先根遍历根结点的每一棵子树。 2)后根遍历 后根遍历的定义为: 1、按照从左到右的顺序后根遍历根结点的每一棵子树; 2、访问根结点。
示例:
先根和后根遍历如图2.1(a)
所示的树,及先根和中根遍历图2.1(b)
所示的二叉树。![]()
根据树的遍历规则,如
根据二叉树的遍历规则:图2.1(a)
所示的树的先根遍历结果是:A,B,C,D,E,F,I,J,D,H;后根遍历结果是:E,C,I,F,J,B,D,H,A。图2.1(a)
所示的二叉树的先根遍历结果是:A,B,C,E,F,I,J,D,H;中根遍历结果是:E,C,I,F,J,B,D,H,A。图
2.1(b)所示的二叉树其实是
图2.1(a)`所示的树转换而来的,又示例的遍历结果可知: 1)前序遍历一棵树恰好等价于前序遍历该树对应的二叉树。 2)后序遍历树恰好等价于中序遍历该树对应的二叉树。
2.2 森林的遍历
森林的遍历右前序遍历和后序遍历两种方式。
1)前序遍历 前序遍历的定义为: 1、访问森林中第一棵树的根结点; 2、前序遍历第一棵树的根结点的子树; 3、前序遍历去掉第一棵树后的子森林。 2)后序遍历 后序遍历的定义为: 1、后序遍历第一棵树的根结点的子树; 2、访问森林中第一棵树的根结点; 3、后序遍历去掉第一棵树后的子森林。
示例:
先根和后根遍历如图2.2(a)
所示的森林,及先根和中根遍历图2.2(b)
所示的二叉树。![]()
根据森林的遍历规则,
根据二叉树的遍历规则,图2.2(a)
所示的树的先根遍历结果是:A,B,C,D,E,F,G,H,I,J,K,L;后根遍历的结果是:B,A,C,F,G,E,D,J,K,I,L,H。图2.2(b)
所示的二叉树的先根遍历结果是:A,B,C,D,E,F,G,H,I,J,K,L;中根遍历结果是:B,A,C,F,G,E,D,J,K,L,H。图2.2(b)
所示的二叉树其实是图2.2(a)
所示的森林转换而来的,由示例的遍历结果可推知: 1、前序遍历一个森林恰好等价于前序遍历该森林对应的二叉树。 2、后序遍历森林恰好等价于中序遍历该森林对应的二叉树。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年04月11日 12时32分38秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
比技术还重要的事
2021-05-09
linux线程调度策略
2021-05-09
软中断和实时性
2021-05-09
Linux探测工具BCC(可观测性)
2021-05-09
Opentelemetry Metrics SDK
2021-05-09
流量控制--2.传统的流量控制元素
2021-05-09
SNMP介绍及使用,超有用,建议收藏!
2021-05-09
SDUT2161:Simple Game(NIM博弈+巴什博弈)
2021-05-09
51nod 1596 搬货物(二进制处理)
2021-05-09
来自星星的祝福(容斥+排列组合)
2021-05-09
Hmz 的女装(递推)
2021-05-09
HDU5589:Tree(莫队+01字典树)
2021-05-09
不停机替换线上代码? 你没听错,Arthas它能做到
2021-05-09
sharding-jdbc 分库分表的 4种分片策略,还蛮简单的
2021-05-09
分库分表的 9种分布式主键ID 生成方案,挺全乎的
2021-05-09
MySQL不会丢失数据的秘密,就藏在它的 7种日志里
2021-05-09
Python开发之序列化与反序列化:pickle、json模块使用详解
2021-05-09
回顾-生成 vs 判别模型-和图
2021-05-09
采坑 - 字符串的 "" 与 pd.isnull()
2021-05-09