找到 N 叉树的根节点
难度:
标签:
题目描述
代码结果
运行时间: 83 ms, 内存: 24.1 MB
/*
* LeetCode 1506: 找到 N 叉树的根节点
* 题目描述:给定一个包含 N 个节点的 N 叉树,每个节点都有一个唯一的值和若干个子节点。
* 要求找到该树的根节点。树中每个节点都可能有多个子节点,根节点是唯一一个不被其他节点指向的节点。
*
* 解题思路:
* 1. 通过流的方式遍历所有节点,记录每个节点的子节点集合。
* 2. 然后再次流式遍历所有节点,找到一个不在子节点集合中的节点,这个节点即为根节点。
*/
import java.util.*;
class Node {
public int val;
public List<Node> children;
public Node() {}
public Node(int val) {
this.val = val;
}
public Node(int val, List<Node> children) {
this.val = val;
this.children = children;
}
}
public class Solution {
public Node findRoot(List<Node> tree) {
Set<Node> seenChildren = tree.stream()
.flatMap(node -> node.children.stream())
.collect(Collectors.toSet());
// 找到根节点
return tree.stream()
.filter(node -> !seenChildren.contains(node))
.findFirst()
.orElse(null); // 如果没有找到,返回null
}
}
解释
方法:
这个题解使用了集合来找出N叉树的根节点。首先,它将所有节点存储到一个集合中。接着,它遍历每一个节点,对于每个节点的所有子节点,从集合中移除这些子节点。因为所有非根节点都会作为某个节点的子节点出现,最后集合中剩下的唯一节点就是根节点,因为根节点不会被任何节点作为子节点引用。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
题解中使用`集合`来存储节点和移除子节点的方式是否能正确处理节点中存在重复引用的情况?
▷🦆
题解中提到如果`node_set`为空则返回`None`,这种情况是如何出现的?是否意味着输入的树列表`tree`为空或存在其他异常情况?
▷🦆
为什么题解选择使用集合而不是其他数据结构,如哈希表或列表,来实现这个算法?集合在这里有什么优势?
▷🦆
在遍历节点并移除子节点引用的过程中,如果一个子节点被多个父节点引用,这种情况下算法是否还能正确识别出根节点?
▷