找到二叉树中最近的右侧节点
难度:
标签:
题目描述
代码结果
运行时间: 124 ms, 内存: 44.3 MB
/*
题目思路:
1. 使用层序遍历和队列来遍历二叉树。
2. 使用Java Stream API从队列中过滤并找到目标节点。
3. 一旦找到目标节点,返回其右侧的节点,如果没有右侧节点,返回null。
*/
import java.util.*;
import java.util.stream.*;
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
class Solution {
public TreeNode findNearestRightNode(TreeNode root, TreeNode u) {
if (root == null) return null;
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
List<TreeNode> levelNodes = new ArrayList<>();
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode currentNode = queue.poll();
levelNodes.add(currentNode);
if (currentNode.left != null) queue.offer(currentNode.left);
if (currentNode.right != null) queue.offer(currentNode.right);
}
Optional<TreeNode> node = levelNodes.stream().filter(n -> n == u).findFirst();
if (node.isPresent()) {
int index = levelNodes.indexOf(node.get());
return index == levelNodes.size() - 1 ? null : levelNodes.get(index + 1);
}
}
return null; // 如果遍历完都没有找到,返回null
}
}
解释
方法:
此题解采用层序遍历(广度优先搜索)的方法来寻找最近的右侧节点。首先,将根节点加入队列。每一次循环处理当前层的所有节点,记录当前层的节点数量,然后逐个将这些节点出队。对于每个出队的节点,检查它是否是目标节点u。如果是,并且不是这一层的最后一个节点,那么下一个出队的节点即为最近的右侧节点;如果是这一层的最后一个节点,则返回None。同时,将每个节点的左右子节点依次加入队列以便于下一轮循环处理。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
如何确保队列中的节点顺序总是按照每层从左到右的顺序进行?
▷🦆
如果待查找的节点u不存在于树中,这段代码会如何处理?
▷🦆
在此题解中,对于非目标节点u的右侧节点处理逻辑是什么?例如,如果目标节点u是某一层的最后一个节点,该如何确保返回None?
▷🦆
此算法在面对空树(root为None)的情况下是否还能正常运行?如果可以,其返回值是什么?
▷