文章
1
粉丝
0
获赞
0
访问
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...
登录后发布评论
暂无评论,来抢沙发