数据结构 · 考研实训
最长根叶路径
离线可用
实训任务从根结点出发,找到最深的叶结点。等长时,保留最左的一条路径。
你要解决的问题
给定二叉链表存储的二叉树,输出一条从根到最深叶结点的结点序列。若有多条等长路径,输出先沿左子树遍历时遇到的第一条。
路径不能在中间结点结束,也不是任意两个结点之间的最长路径。
依据:山东大学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 条边。
网页逐步模拟固定程序的算法逻辑;源文件可下载后独立编译运行。
二叉树
当前结点当前路径已保存答案
看懂存储方式与输入序列 二叉链表 · 先序+# +
在内存里:二叉链表
每个结点包含一个数据域和两个孩子指针。下表展示当前树的连接关系,NULL表示空指针。
data:结点值left:左孩子指针right:右孩子指针nodes[MAXN]是提供结点内存的静态结点池;左右孩子通过指针连接。
| 结点 | 左指针指向 | 右指针指向 |
|---|
输入时:带空标记的先序序列
从根开始,按“根 → 左子树 → 右子树”读取。每个字母或数字建立一个结点,每个#表示此处的孩子为空。读完一整棵左子树,才开始读右子树。
当前层次—最长结点数0路径边数—
∅ 表示本次进入的空子树当前路径数组 path
已保存答案
best递归调用栈
叶结点比较记录
尚未遇到叶结点| 根叶路径 | 结点数 | 与原答案比较 | 处理 |
|---|