第五章树和二叉树(5.6.2-5.6.3)
5.6.2森林与二叉树的转换
1.森林转换成二叉树
如果F={T1,T2,…,Tm}是森林,则可按如下规则转换成一棵二叉树B= (root, LB, RB)。
(1)若F为空,即m= 0,则B为空树;
(2)若F非空,即m"'F-0, 则B的根root即为森林中第一棵树的根ROOT(T,1 ); B的左子树LB是从兀中根结点的子树森林F1= {T11, T12, …, Tim}转换而成的二叉树;其右子树RB是从森林F'= {T2, T3 , …,Tm}转换而成的二叉树。
2.二叉树转换成森林
如果B=(root, LB, RB)是一棵二叉树,则可按如下规则转换成森林F={T1,T2 , …,Tm}
(1)若B为空,则F为空;
(2)若B非空,则F中第一棵树兀的根ROOT(T1 )即为二叉树B的根root; 兀中根结点的子树森林F1是由B的左子树LB转换而成的森林;F中除T1 之外其余树组成的森林F'={T2 , T3 , …,Tm}是由B的右子树RB转换而成的森林。
从上述递归定义容易写出相互转换的递归算法。同时,森林和树的操作亦可转换成二叉树的操作来实现。
5.6.3树和森林的遍历
1.树的遍历
由树结构的定义可引出两种次序遍历树的方法:一种是先根(次序)遍历树,即:先访问树的根结点,然后依次先根遍历根的每棵子树;另一种是后根(次序)遍历,即先依次后根遍历每棵子树,然后访问根结点。
例如,对图 5.19 所示的树进行先根遍历,可得树的先根序列为:RADEBCFGHK 若对此树进行后根遍历,则得树的后根序列为:DEABGHKFCR 按照森林和树相互递归的定义,可以推出森林的两种遍历方法:先序遍历和中序遍历。
2.森林的遍历
(1) 先序遍历森林
若森林非空,则可按下述规则遍历:
1.访问森林中第一棵树的根结点;
2.先序遍历第一棵树的根结点的子树森林;
3.先序遍历除去第一棵树之后剩余的树构成的森林。
(2)中序遍历森林
若森林非空,则可按下述规则遍历:
1.中序遍历森林中第一棵树的根结点的子树森林;
2.访问第一棵树的根结点;
3.中序遍历除去第一棵树之后剩余的树构成的森林。
若对图5.24中所示的森林进行先序遍历和中序遍历,则分别得到森林的先序序列为:ABCDEFGHIJ
中序序列为:BCDAFEHJIG
由 5.6.2小节森林与二叉树之间转换的规则可知,当森林转换成二叉树时,其第一棵树的子树森林转换成左子树,剩余树的森林转换成右子树,则上述森林的先序和中序遍历即为其对应的二叉树的先序和中序遍历。若对图5.24中所示的和森林对应的二叉树分别进行先序和中序遍历,可得和上述相同的序列。
由此可见, 当以二叉链表做树的存储结构时,树的先根遍历和后根遍历可借用二叉树的先序遍历和中序遍历的算法实现。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY