返回介绍

solution / 1500-1599 / 1530.Number of Good Leaf Nodes Pairs / README_EN

发布于 2024-06-17 01:03:18 字数 6480 浏览 0 评论 0 收藏 0

1530. Number of Good Leaf Nodes Pairs

中文文档

Description

You are given the root of a binary tree and an integer distance. A pair of two different leaf nodes of a binary tree is said to be good if the length of the shortest path between them is less than or equal to distance.

Return _the number of good leaf node pairs_ in the tree.

 

Example 1:

Input: root = [1,2,3,null,4], distance = 3
Output: 1
Explanation: The leaf nodes of the tree are 3 and 4 and the length of the shortest path between them is 3. This is the only good pair.

Example 2:

Input: root = [1,2,3,4,5,6,7], distance = 3
Output: 2
Explanation: The good pairs are [4,5] and [6,7] with shortest path = 2. The pair [4,6] is not good because the length of ther shortest path between them is 4.

Example 3:

Input: root = [7,1,4,6,null,5,3,null,null,null,null,null,2], distance = 3
Output: 1
Explanation: The only good pair is [2,5].

 

Constraints:

  • The number of nodes in the tree is in the range [1, 210].
  • 1 <= Node.val <= 100
  • 1 <= distance <= 10

Solutions

Solution 1

# Definition for a binary tree node.
# class TreeNode:
#   def __init__(self, val=0, left=None, right=None):
#     self.val = val
#     self.left = left
#     self.right = right
class Solution:
  def countPairs(self, root: TreeNode, distance: int) -> int:
    def dfs(root, cnt, i):
      if root is None or i >= distance:
        return
      if root.left is None and root.right is None:
        cnt[i] += 1
        return
      dfs(root.left, cnt, i + 1)
      dfs(root.right, cnt, i + 1)

    if root is None:
      return 0
    ans = self.countPairs(root.left, distance) + self.countPairs(
      root.right, distance
    )
    cnt1 = Counter()
    cnt2 = Counter()
    dfs(root.left, cnt1, 1)
    dfs(root.right, cnt2, 1)

    for k1, v1 in cnt1.items():
      for k2, v2 in cnt2.items():
        if k1 + k2 <= distance:
          ans += v1 * v2
    return ans
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *   int val;
 *   TreeNode left;
 *   TreeNode right;
 *   TreeNode() {}
 *   TreeNode(int val) { this.val = val; }
 *   TreeNode(int val, TreeNode left, TreeNode right) {
 *     this.val = val;
 *     this.left = left;
 *     this.right = right;
 *   }
 * }
 */
class Solution {
  public int countPairs(TreeNode root, int distance) {
    if (root == null) {
      return 0;
    }
    int ans = countPairs(root.left, distance) + countPairs(root.right, distance);
    int[] cnt1 = new int[distance];
    int[] cnt2 = new int[distance];
    dfs(root.left, cnt1, 1);
    dfs(root.right, cnt2, 1);
    for (int i = 0; i < distance; ++i) {
      for (int j = 0; j < distance; ++j) {
        if (i + j <= distance) {
          ans += cnt1[i] * cnt2[j];
        }
      }
    }
    return ans;
  }

  void dfs(TreeNode root, int[] cnt, int i) {
    if (root == null || i >= cnt.length) {
      return;
    }
    if (root.left == null && root.right == null) {
      ++cnt[i];
      return;
    }
    dfs(root.left, cnt, i + 1);
    dfs(root.right, cnt, i + 1);
  }
}
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *   int val;
 *   TreeNode *left;
 *   TreeNode *right;
 *   TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *   TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *   TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
  int countPairs(TreeNode* root, int distance) {
    if (!root) return 0;
    int ans = countPairs(root->left, distance) + countPairs(root->right, distance);
    vector<int> cnt1(distance);
    vector<int> cnt2(distance);
    dfs(root->left, cnt1, 1);
    dfs(root->right, cnt2, 1);
    for (int i = 0; i < distance; ++i) {
      for (int j = 0; j < distance; ++j) {
        if (i + j <= distance) {
          ans += cnt1[i] * cnt2[j];
        }
      }
    }
    return ans;
  }

  void dfs(TreeNode* root, vector<int>& cnt, int i) {
    if (!root || i >= cnt.size()) return;
    if (!root->left && !root->right) {
      ++cnt[i];
      return;
    }
    dfs(root->left, cnt, i + 1);
    dfs(root->right, cnt, i + 1);
  }
};
/**
 * Definition for a binary tree node.
 * type TreeNode struct {
 *   Val int
 *   Left *TreeNode
 *   Right *TreeNode
 * }
 */
func countPairs(root *TreeNode, distance int) int {
  if root == nil {
    return 0
  }
  ans := countPairs(root.Left, distance) + countPairs(root.Right, distance)
  cnt1 := make([]int, distance)
  cnt2 := make([]int, distance)
  dfs(root.Left, cnt1, 1)
  dfs(root.Right, cnt2, 1)
  for i, v1 := range cnt1 {
    for j, v2 := range cnt2 {
      if i+j <= distance {
        ans += v1 * v2
      }
    }
  }
  return ans
}

func dfs(root *TreeNode, cnt []int, i int) {
  if root == nil || i >= len(cnt) {
    return
  }
  if root.Left == nil && root.Right == nil {
    cnt[i]++
    return
  }
  dfs(root.Left, cnt, i+1)
  dfs(root.Right, cnt, i+1)
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文