社区
数据结构与算法
帖子详情
森林的后根次序遍历问题
skyspeed
2003-10-16 10:52:15
请教:
下面是一个以左孩子、右兄弟法表示的森林:
A
/ \
B \
\ \
C \
\ \
D \
/ F
E / \
G H
/
I
/ \
K J
请问它的后根次序遍历的结果?
...全文
369
5
打赏
收藏
森林的后根次序遍历问题
请教: 下面是一个以左孩子、右兄弟法表示的森林: A / \ B \ \ \ C \ \ \ D \ / F E / \ G H / I / \ K J 请问它的后根次序遍历的结果?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
skyspeed
2003-10-16
打赏
举报
回复
我想的答案跟你们一样,树上写的果然有问题,能不能再说一下详细步骤? 谢谢
活力华华哥
2003-10-16
打赏
举报
回复
E D C B G K J I H F A
「已注销」
2003-10-16
打赏
举报
回复
E D C B G K J I H F A
「已注销」
2003-10-16
打赏
举报
回复
规则很简单的,先孩子再根结点,孩子中先左孩子再右孩子。
skyspeed
2003-10-16
打赏
举报
回复
UP!
数据结构操作题.doc
线性表 1. (5')说明线性表、栈与队的异同点。 答: 2. 在如下数组A中链接存储了一个线性表,表头指针为A [0].next,试写出该线性表。 【解答】 数组和广义表 3. 已知广义表A=((a,b),c,(d,e,f))试画出它的存贮结构。 【解答】 4. 已知广义表A=((),(e),(a,(b,c,d))),试画出它的存贮结构。 【解答】 5. 已知一个6×5稀疏矩阵如下所示 试: 写出它的三元组线性表; 给出三元组线性表的顺序存储表示。 【解答】 树 6. 按照下列给定二叉树的先序
遍历
序列和中序
遍历
序列,构造出二叉树。 先序
遍历
序列:EBADCFHGIKJ 中序
遍历
系列:ABCDEFGHIJK。 7. 对给定的权值{2,3,4,7,8,9},构造出相应的赫夫曼树和赫夫曼编码,并求出带 权路径的长度WPL。 【解答】 8. 试分别画出具有3个结点的二叉树的所有不同形态。 【解答】 9. 将此二叉树变换为
森林
(4分),用后
根
序
遍历
该
森林
,写出
遍历
的结点序列(3分)。 【解答】 10. 已知一棵树的先
根
遍历
次序
为abefgcdhi,后
根
遍历
次序
为efgbchida,试画出此树,
建立二叉树,并输出二叉树的先序,中序和后序
遍历
序列,以及二叉树的叶子数
二叉树可执行代码,用了就知道 。 二叉树的
遍历
、线索及应用( 用递归或非递归的方法都可以) [
问题
描述] 建立二叉树,并输出二叉树的先序,中序和后序
遍历
序列,以及二叉树的叶子数。 [基本要求] 要求
根
据读取的元素建立二叉树,能输出各种
遍历
。 [实现提示] 可通过输入带空格的前序序列建立二叉链表。
完全二叉树 满二叉树 二叉树
遍历
(前序、中序、后序).pdf
满二叉树的前序
遍历
1.概念 在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,
次序
不能颠倒。二叉树的第i层至多有2^{i-1}个结点;深度为k的二叉树至多有2^k-1个结点;对任何一棵二叉树T,如果其终端结点数为n_0,度为2的结点数为n_2,则n_0=n_2+1。一棵深度为k,且有2^k-1个节点称之为满二叉树;深度为k,有n个节点的二叉树,当且仅当其每一个节点都与深度为k的满二叉树中,序号为1至n的节点对应时,称之为完全二叉树。 二叉树在图论中是这样定义的:二叉树是一个连通的无环图,并且每一个顶点的度不大于3。有
根
二叉树还要满足
根
结点的度不大于2。有了
根
结点之后,每个顶点定义了唯一的父结点,和最多2个子结点。然而,没有足够的信息来区分左结点和右结点。如果不考虑连通性,允许图中有多个连通分量,这样的结构叫做
森林
。
中序先序构建二叉树,按层输出二叉树及其
森林
节点内容
(5)算法描述(伪语言及分析) 1?构造二叉树的抽象数据结构 2?输入先序和中序 3?
根
据先序中序建立二叉树,先确定先序中的
根
节点,再在中序中
遍历
,则将中序结点分为左子树、
根
、右子树,利用递归继续如此操作 4?按层输出二叉树的所有节点内容 5?按层输出上述二叉树所表示的
森林
的所有节点内容
第五章 树与二叉树
5.1 数的逻辑结构 5.1.1 1、树的定义 在树中常常将数据元素称为结点 (1)有且仅有一个特定的称为
根
的结点; (2)当n>1时,除
根
结点之外的其余结点被分成m(m>0)个互不相交的有限集合T1,T2,•••Tm,其中每个集合又是一棵树,并称为这个节点的子树。 2、树的基本术语: 结点的度、树的度 叶子节点、分支结点 孩子节点、分支结点、兄弟节点 路径、路径长度 祖先、子孙 结点的层数、树的深度(高度) 层序编号 有序树、无序树
森林
5.1.2 树的抽象数据类型定义 5.1.3树的
遍历
操作 1、前序
遍历
树的前序
遍历
操作定义为: 若树为空,则空操作返回;否则 (1)访问
根
结点 (2)按照从左向右的顺序前序
遍历
根
结点的每一棵子树。 2、中序
遍历
树的中序
遍历
操作定义为: 若树为空,则空操作返回;否则 (1)按照从左向右的顺序后序
遍历
根
结点的每一棵子树; (2)访问
根
结点。 3、层序
遍历
树的层序
遍历
也称作树的广泛
遍历
,其操作定义为树的第一层开始,自上而下逐层
遍历
,在同一层中,按从左向右的顺序对结点逐个访问。 5.2树的存储结构 5.2.1 双亲表示法 由树的定义可知,树中每个结点都有且仅有一个双亲结点。所以利用这一特性,可以用一维数组来存储各个结点,数组中一个元素对应一个结点,数组元素包括树中结点的数据信息以及该结点的双亲在数组中的下标。 其中: Data为数据域,存储树中结点的数据信息; Parent为指针即游标,存储该结点的双亲在数组中的小标。 5.2.2孩子表示法 1、多重链表表示法 (1)指针域的个数等于该结点的度。 (2)指针域的个数等于树的度。 2、孩子链表表示法 把孩子看成一个线性表,且以单链表存储,称为该结点的孩子链表。则n个结点有n个孩子链表。 孩子节点有两类:孩子节点、表头结点。 5.2.3 双亲孩子表示法 即将双亲表示法和孩子链表表示法相结合的存储方法。仍将各结点的孩子分别组成单链表,同时用一维数组顺序存储树中的各结点,数组元素除了包括结点的数据信息和该结点的孩子链表的头指针之外,还增设一个域存储该结点的双亲在数组的下标。 5.2.4孩子兄弟表示法 又称二链表表示法,其方法是链表中每个结点除数据域外,还设置了两个指针分别指向该结点的第一个孩子和右兄弟链表的结构: Firstchild data rightsib 指针域,存储第一个孩子结点的存储地址 数据域,存储该结点的数据信息 指针域,存储该结点右兄弟结点的存储地址 5.3二叉树的逻辑结构 最简单的树结构,特别适合计算机处理,而且任何数都可以简单的转换为二叉树。(重点内容) 5.3.1二叉树的定义 二叉树是n(n>=0)个结点的有限集合,该集合或者为空集,或者有一个
根
节点和两棵互不相交的、分别称为
根
节点的左子树和右子树的二叉树组成。 二叉树具有五种基本形态: 1、空二叉树; 2、只有一个
根
结点; 3、
根
结点只有左子树; 4、
根
结点只有右子树; 5、
根
结点既有左子树又有右子树 特殊二叉树: 1、斜树; 2、满二叉树; 3、完全二叉树; 5.3.2二叉树的基本性质 性质5-1 二叉树的第i层上最多有2^(i-1)个结点(i>=1)。 性质5-2 在一棵深度为k的二叉树中,最多有2^k-1个结点,最少有k个结点。 性质5-3 在一棵二叉树中,如果叶子结点的个数为n0,度为2的结点个数为n2,则n0=n2+1. 性质5-4 具有n个结点的完全二叉树的深度为【log2^n】+1。 性质5-5 对一棵具有n个结点的完全二叉树中的结点从一开始按层序编号,则对于任意的编号为i(1<=i<=n)的结点,有: (1)如果i>1,则结点i的双亲的编号为【i/2】;否则结点i是
根
结点,无双亲。 (2)如果2i<=n,则 结点i的左孩子的编号为2i;否则结点i无左孩子。 (3)如果2i+1<=n,则结点i的右孩子的编号为2i+1,否则结点i无右孩子。 5.3.3 二叉树的抽象数据类型定义 同树类似,在不同的应用中,二叉树的基本操作不尽相同。 5.3.4 二叉树的
遍历
操作 二叉树的
遍历
是指从
根
节点出发,按照某种
次序
访问二叉树是所有结点,使得每个结点被访问一次且仅被访问一次。由于二叉树中每个结点都可能有两个子树,因此需要寻找一条合适的搜索路径。 1、前序
遍历
前序
遍历
二叉树操作定义为: 若树为空,则空操作返回;否则 (1)访问
根
结点 (2)前序
遍历
根
结点的左子树 (3)前序
遍历
根
结点的右子树 2、中序
遍历
中序
遍历
二叉树操作定义为: 若树为空,则空操作返回;否则 (1)中序
遍历
根
结点的左子树 (2)访问
根
结点 (3)中序
遍历
根
结点的右子树 3、后序
遍历
后序
遍历
根
结点的左子树 后序
遍历
根
结点的右子树 访问
根
结点 4、层序
遍历
二叉树的层序
遍历
是指从二叉树的第一层开始,从上之下逐层
遍历
,在同一层中,按从左到右的顺序对结点逐个访问。 5.4 二叉树存储结构及实现 5.4.1 顺序存储结构 具体步骤: (1)将二叉树按完全二叉树编号。 (2)将二叉树中的结点一编号顺序存储到一维数组中。 5.4.2 二叉链表 基本思想: 令二叉树的每个结点对应一个链表结点,链表结点除了存放于二叉树结点有关的数据信息外,还要设置指示左右孩子的指针。 5.4.3 三叉链表 在二叉链表存储方式下,从某个结点出发可以直接访问它的孩子结点,但要找到它的双亲结点,则需要从
根
节点开始搜索,最坏的情况下,需要
遍历
整个二叉链表。此时采用三叉树链表储存二叉树。 其中,data,lchild,rchild三个域的含义同二叉树,parent域为指向该结点的双亲结点指针。 5.4.4 线索链表 按照某种
遍历
次序
对二叉树进行
遍历
,可以把二叉树中所有结点排成一个线性序列。在集体应用中,有时需要访问二叉树中的结点在某种
遍历
序列中前驱和后继,此时,在存储结构中应该保存结点在某种
遍历
序列中的前驱和后继信息。 前驱和后继结点的指针称为线索,加上线索的二叉树称为线索二叉树,加上线索的二叉链表称为线索链表。 5.5 二叉树
遍历
的非递归算法 5.5.1 前序
遍历
非递归算法 关键:在前序
遍历
过某个左子树后,如何找到该结点的右子树的
根
指针。 一般的前序
遍历
执行过程中,设要
遍历
二叉树的
根
指针为bt,可能出现两种情况: (1)若bt!=NULL,则表明当前二叉树不为空,此时,应输入
根
结点bt的值并将bt保存到栈中,准备继续
遍历
bt的左子树。 (2)若bt=NULL,则表明以bt为
根
指针的二叉树
遍历
完毕,并且bt是栈顶指针所指结点的左子树,若栈不空,则应
根
据栈顶指针所指结点找到待
遍历
右子树的
根
指针并赋予bt,以继续
遍历
下去;若栈空,则表明整个二叉树
遍历
完毕。 5.5.2 中序
遍历
非递归算法 此算法只是需要将前序
遍历
的非递归算法中输出的语句cout<
data移到bt=s[top--]之后即可。 5.5.3 后序
遍历
非递归算法 后序
遍历
的不同在于:结点要出入两次栈,出两次栈,这种情况的含义和处理方法为: (1)第一次出栈:只
遍历
晚左子树,右子树尚未
遍历
,则该结点不出栈,利用栈顶结点找到它的右子树,准备
遍历
它的右子树。 (2)第二次出栈:
遍历
完右子树,该结点出栈,并访问它。 设
根
指针为bt,则可能有以下两种情况: (1)若bt!=NULL,则bt及标志flag入栈,
遍历
其左子树。 (2)若bt=NULL,此时栈空,则整个
遍历
结束;若栈不空,则表明栈顶结点的左子树或右子树已
遍历
结束。若栈顶点的标志flag=1,则表明栈结点的左子树已
遍历
完毕,将flag修改为2,修改为2,并
遍历
栈定点的右子树;若栈顶结点的标志flag=2,则表明栈结点的右子树也
遍历
完毕,输出栈顶结点。 5.6 树、
森林
与二叉树的转换 1.树转换为二叉树 将一棵树转换为二叉树的方法为: (1)加线——树中所有相邻的兄弟结点之间加一条线; (2)去线——对树中的每个节点,只保留它与第一个孩子结点之间的连线,删去它与其他孩子结点之间的连线。 (3)层次调节——以
根
结点为轴心,将树顺时针转动一定角度,使之层次分明。 2.
森林
转换成二叉树 (1)将
森林
中的每一棵二叉树转化成二叉树; (2)从第二课二叉树开始,依次把后一棵二叉树的
根
结点作为一棵二叉树
根
节点的右孩子,当所有二叉树连起来后,此时所得到的二叉树就是由
森林
转换得到的二叉树。 3、二叉树转换为树或
森林
(1)加线——若某个结点x是其双亲y的左孩子,则把结点x的右孩子、右孩子的右孩子、……,都与结点y用线连起来; (2)去线——删去原二叉树中所有的双亲结点与右孩子结点的连线; (3)层次调整——整理由(1)、(2)两步所得到的树或
森林
,使之层次分明。 (4)
森林
的
遍历
两种
遍历
方法;前序
遍历
后续
遍历
。 5.7 应用举例 5.7.1 二叉树的应用举例——哈夫曼及哈夫曼编码 1、哈夫曼树也称最优二叉树,在实际中有着广泛的应用。 叶子节点的权值 是对叶子结点赋予的一个有意义的数值量。 二叉树的带权路径长度 设二叉树具有n个带权值的叶子节点,从
根
节点到叶子节点的路径长度与相应的叶子节点权值的乘积之和叫做二叉树的带权路径长度,记为: WPL=EWkLk 哈夫曼树 给定一组具有确定权值的叶子结点,可以构造出不同的二叉树,将其中带权值路径长度最小的二叉树称为哈夫曼树。 哈夫曼算法基本思想: (1)初始化:由给定的n个权值构造n棵只有一个
根
结点的二叉树,从而得到一个二叉树集合。 (2)选取与合并:在F中选取
根
结点的权值最小的两棵二叉树分别作为左、右子树构造一棵新的二叉树,这棵新的二叉树的
根
结点的权值为其左右子树
根
结点的权值之和。 (3)删除与加入:在F中删除作为左、右子树的两棵二叉树,并将新建的二叉树加入到F中。 (4)重复(2)(3)两步的操作,当集合F只剩下一棵二叉树时这棵二叉树便是哈夫曼树。 2、哈夫曼编码 在进行程序设计时,通常给每一个字符记一个单独的代码来表示一组字符,我们称之为编码。
数据结构与算法
33,008
社区成员
35,326
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章