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

输入:root = [1,2,3,4,5,6,7], distance = 3
输出:2
解释:好叶子节点对为 [4,5] 和 [6,7] ,最短路径长度都是 2 。但是叶子节点对 [4,6] 不满足要求,因为它们之间的最短路径长度为 4 。
提示:
- tree 的节点数在 [1, 2^10] 范围内。
- 每个节点的值都在 [1, 100] 之间。
- 1 <= distance <= 10
注意本题返回叶子节点的对数。我开始还以为求子树的个数想了半个多小时,后来再审题,发现求对数,那就简单了,求出每个节点的左右子树,都有哪些叶子节点,深度是多少,然后两个集合运算就行了,最后在吧两个集合合并给上级节点。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| class Solution { public int countPairs(TreeNode root, int distance) { this.distance = distance; List<Integer> list = traverse(root,0); return count; } private int count = 0; private int distance = 0; public List<Integer> traverse(TreeNode root,int depth) { if (root == null) { return new LinkedList<>(); } LinkedList<Integer> rl = new LinkedList<>(); if (root.left == null && root.right == null) { rl.add(depth); return rl; } List<Integer> left = new LinkedList<>(); List<Integer> right = new LinkedList<>(); if (root.left != null) left = traverse(root.left,depth + 1); if (root.right != null) right = traverse(root.right,depth + 1); if (left.size() == 0) { return right; } if (right.size() == 0) { return left; } for (int i = 0; i < left.size(); i++) { int a = left.get(i); for (int j = 0; j < right.size(); j++) { int b = right.get(j); if ((a - depth) + (b - depth) <= distance) { count++; } } } for (int i = 0; i < left.size(); i++) { rl.add(left.get(i)); } for (int i = 0; i < right.size(); i++) { rl.add(right.get(i)); } return rl; } }
|
很简单的遍历问题,别想复杂了就好,这种返回list形式的题之前的周赛也遇到过。
leetcode 118