文章

1

粉丝

0

获赞

0

访问

438

头像
2025 年 9 月第 1 次 408 月考试卷 - 第41题回答
数据结构
发布于2025年9月20日 17:08
阅读数 438

(1)

算法的核心思想是遍历二叉树的每一个节点,并对每个节点进行检查,看它是否满足题目给出的两个条件。

遍历方式: 采用递归的方式对二叉树进行深度优先遍历(前序、中序或后序遍历均可),这样可以访问到树中的每一个节点。

节点检查:

对于当前访问的节点 curr,首先检查它是否满足结构条件:curr->left 和 curr->right 是否都非空。如果不是,则该节点不满足要求,直接跳过。

如果满足结构条件,接着检查距离条件。这需要两个辅助函数或者过程来完成:

寻找左子树的最小距离: 在二叉搜索树中,与节点 curr 值最接近且比它小的节点,一定是其左子树中最靠右的节点(即 curr 的中序遍历前驱)。因此,我们从 curr->left 开始,一直向右走到底,找到的那个节点就是距离 curr 最近的左子树节点。计算 |该节点值 - curr->val| 得到 min_dist_left。

寻找右子树的最小距离: 同样地,与节点 curr 值最接近且比它大的节点,一定是其右子树中最靠左的节点(即 curr 的中序遍历后继)。我们从 curr->right 开始,一直向左走到底,找到的那个节点就是距离 curr 最近的右子树节点。计算 |该节点值 - curr->val| 得到 min_dist_right。

比较 min_dist_left 和 min_dist_right。如果它们相等,则说明当前节点 curr 满足所有条件,我们将计数器加一。

递归与合并结果:

对当前节点检查完毕后,递归地对它的左子节点和右子节点调用相同的检查过程。

最终的结果是:当前节点是否满足条件 (0 或 1) + 左子树中满足条件的节点数 + 右子树中满足条件的节点数。

入口函数: countNodes 函数作为递归的入口,初始化一个计数器,然后调用递归函数从根节点开始遍历和计算。

(2)

#include <iostream>

#include <cmath>

#include <algorithm>

// 定义二叉树节点结构

typedef struct TreeNode {

  &nbs...

登录查看完整内容


登录后发布评论

暂无评论,来抢沙发