数据结构 · 考研实训

最长根叶路径

离线可用
实训任务从根结点出发,找到最深的叶结点。等长时,保留最左的一条路径。题目与输入 +

你要解决的问题

给定二叉链表存储的二叉树,输出一条从根到最深叶结点的结点序列。若有多条等长路径,输出先沿左子树遍历时遇到的第一条。

路径不能在中间结点结束,也不是任意两个结点之间的最长路径。

依据:山东大学2018年硕士研究生入学考试,909《数据结构》,算法题第2题。例树和输入方式为本实训自拟。查看原题

输入与运行

输入带空标记的先序序列:根 → 左 → 右。每个结点用一个英文字母或数字表示,#表示空子树,最多100个结点。输入须完整、合法。

例如:A##是单结点树;AB##C##表示根A的左孩子为B、右孩子为C。

保存源文件后执行:cc -std=c11 longest_path.c -o longest_path,再执行./longest_path并输入序列。输出用空格分隔,空树输出“空树”。

程序使用静态结点数组保存结点,以左右指针组成二叉链表;无需另外分配或释放内存。

参考程序 高亮同步 · 长行可左右滚动
先走左边,只在更长时更新。
用严格大于号 >,等长时保留先找到的最左路径。

根的 depth 为0,也是路径数组的下标。到叶子时,路径有 depth + 1 个结点、depth 条边。

网页逐步模拟固定程序的算法逻辑;源文件可下载后独立编译运行。

二叉树
当前结点当前路径已保存答案
输入:先序+空标记(#) · 存储:二叉链表 · 应用后重新开始演示
随机形状,生成非完全二叉树;便于演示,选5—15个结点。
看懂存储方式与输入序列 二叉链表 · 先序+# +

在内存里:二叉链表

每个结点包含一个数据域和两个孩子指针。下表展示当前树的连接关系,NULL表示空指针。

data:结点值left:左孩子指针right:右孩子指针

nodes[MAXN]是提供结点内存的静态结点池;左右孩子通过指针连接。

结点左指针指向右指针指向

输入时:带空标记的先序序列

从根开始,按“根 → 左子树 → 右子树”读取。每个字母或数字建立一个结点,每个#表示此处的孩子为空。读完一整棵左子树,才开始读右子树。

当前层次—最长结点数0路径边数—
∅ 表示本次进入的空子树
起

当前路径数组 path

已保存答案
best

递归调用栈

叶结点比较记录
尚未遇到叶结点
根叶路径结点数与原答案比较处理
最长根叶路径: