java 森林_Java数据结构--树、森林和二叉树

一、树、森林和二叉树之间的转换

树或森林与二叉树之间存在一一对应的关系。任何一棵树或一个森林可唯一地对应到一棵二叉树;反之,任何一棵二叉树也能唯一地对应到一个森林或一棵树。

1.1 将树转化为二叉树

树中每个结点最多只有一个最左边的孩子(长子)和一个右邻的兄弟。按照这种关系很自然地就能将树转换成相应的二叉树,具体步骤是:

1)在所有兄弟结点之间加一连线;

2)对每个结点,除了保留与其长子的连线外,去掉该结点与其他孩子的连线。

示例:将图2.1所示的树转换为二叉树。

0baef108420e405fac3c54151fc90db6.jpg

根据树转二叉树的规则:第一步,加线;第二步:抹线;第三步:旋转。具体过程如图2.2所示。

db8a84b66bae462da581957f4acecdc2.jpg

注意:由于树根没有兄弟,故树转化为二叉树后,二叉树的根结点的右子树必为空。

1.2 将一个森林转换为二叉树

具体方法:

1)将森林中的每棵树变为二叉树;

2)因为转换所得的二叉树的根结点的右树均为空,故将各二叉树的根结点视为兄弟从左至右连在一起,就形成了一棵二叉树。

示例:将如图2.3所示的森林转化为二叉树

6dca830c6a934f9c9cc01f391f93a59a.jpg

1.3 二叉树到树、森林的转换

把二叉树转换成树和森林的方式是:若结点x是双亲y的左孩子。则把x的右孩子。右孩子的右孩子,…,都与y用连线连起来,最后去掉所有双亲到右孩子的连线。

示例:将图2.4所示的二叉树转换为树。

5144d70823a249d79227d92d62442375.jpg

二、树、森林的遍历

2.1 树的遍历

树的遍历通常有先根遍历和后根遍历两种方式。

1)先根遍历

先根遍历的定义为:

1、访问根结点;

2、按照从左到右的顺序先根遍历根结点的每一棵子树。

2)后根遍历

后根遍历的定义为:

1、按照从左到右的顺序后根遍历根结点的每一棵子树;

2、访问根结点。

示例:

先根和后根遍历如图2.1(a)所示的树,及先根和中根遍历图2.1(b)所示的二叉树。

64d2e386be634f89b144382520e976d1.jpg

根据树的遍历规则,如图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)所示的二叉树。

1e717db2b7264771b21bd558b26f2358.jpg

根据森林的遍历规则,图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、后序遍历森林恰好等价于中序遍历该森林对应的二叉树。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值