PigyChan_LeetCode 1530. 好叶子节点对的数量

1530. 好叶子节点对的数量

难度中等

给你二叉树的根节点 root 和一个整数 distance 。
如果二叉树中两个 叶 节点之间的 最短路径长度 小于或者等于 distance ,那它们就可以构成一组 好叶子节点对 。
返回树中 好叶子节点对的数量 。

示例 1:
在这里插入图片描述

输入:root = [1,2,3,null,4], distance = 3
输出:1
解释:树的叶节点是 3 和 4 ,它们之间的最短路径的长度是 3 。这是唯一的好叶子节点对。
示例 2:
在这里插入图片描述

输入:root = [1,2,3,4,5,6,7], distance = 3
输出:2
解释:好叶子节点对为 [4,5] 和 [6,7] ,最短路径长度都是 2 。但是叶子节点对 [4,6] 不满足要求,因为它们之间的最短路径长度为 4 。

(1)tree 的节点数在 [1, 2^10] 范围内。
(2)每个节点的值都在 [1, 100] 之间。
(3)1 <= distance <= 10

思路1.0(已看题解):

想过保存每个节点到他子节点的距离,但压根不知道怎么实现,看了题解有个用后序遍历的方法。
在每次遍历时返回一个vector数组保存结果(自己一开始想着再创建一个节点数据结构不同的树。。我在想啥),因为需要收集左右子树的信息才能判断结果,所以采用后序遍历。

代码1.0(已完成):
  class Solution {
  public:
      int countPairs(TreeNode* root, int distance) {
          int rst = 0;
          findPairs(root, distance, rst);
          return rst;
      }
      vector<int> findPairs(TreeNode* Tnode, const int& distance, int& rst)
      {
          if (Tnode == NULL) return{};
          //如果是叶节点,返回一个距离为0的vec
          if (Tnode->left == NULL && Tnode->right == NULL) return{ 0 };
          //最终要返回给上一层的,该点到左右子树里所有叶节点的距离
          vector<int> total;
          //遍历该点到左子树里所有叶节点有效距离
          vector<int> left = findPairs(Tnode->left, distance, rst);
          for (auto& i : left)
          {
              if (++i >= distance)
                  continue;
              total.push_back(i);
          }
          //遍历该点到右子树里所有叶节点有效距离
          vector<int> right = findPairs(Tnode->right, distance, rst);
          for (auto& i : right)
          {
              if (++i >= distance)
                  continue;
              total.push_back(i);
          }
          //检验该点有多少好叶子节点对
          for (auto& i : left)
          {
              for (auto& j : right)
              {
                  if ((i + j) <= distance)
                      rst++;
              }
          }
          //返回给上层,该点到所有叶子节点的有效距离
          return total;
      }
  };

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值