题目
二叉树中,如果一个节点是其父节点的唯一子节点,则称这样的节点为 “独生节点” 。二叉树的根节点不会是独生节点,因为它没有父节点。
给定一棵二叉树的根节点 root
,返回树中 所有的独生节点的值所构成的数组 。数组的顺序 不限 。
示例 1:
输入:root = [1,2,3,null,4]
输出:[4]
解释:浅蓝色的节点是唯一的独生节点。
节点 1 是根节点,不是独生的。
节点 2 和 3 有共同的父节点,所以它们都不是独生的。
示例 2:
输入:root = [7,1,4,6,null,5,3,null,null,null,null,null,2]
输出:[6,2]
输出:浅蓝色的节点是独生节点。
请谨记,顺序是不限的。 [2,6] 也是一种可接受的答案。
示例 3:
输入:root = [11,99,88,77,null,null,66,55,null,null,44,33,null,null,22]
输出:[77,55,33,66,44,22]
解释:节点 99 和 88 有共同的父节点,节点 11 是根节点。
其他所有节点都是独生节点。
示例 4:
输入:root = [197]
输出:[]
示例 5:
输入:root = [31,null,78,null,28]
输出:[78,28]
提示:
tree
中节点个数的取值范围是[1, 1000]
。- 每个节点的值的取值范围是
[1, 10^6]
。
解题
方法一: 递归 DFS
思路
深度优先遍历这棵树,遍历到的节点:
- 如果是叶子节点或者
null
直接退出递归。 - 如果是父节点,且只有一个子节点,则把那个子节点加入结果集合中。
代码
class Solution {
private List<Integer> ans = new ArrayList<>();
public List<Integer> getLonelyNodes(TreeNode root) {
dfs(root);
return ans;
}
private void dfs(TreeNode root) {
if (root == null || root.left == null && root.right == null) return;
if (root.left == null) ans.add(root.right.val);
if (root.right == null) ans.add(root.left.val);
dfs(root.left);
dfs(root.right);
}
}
评论区