leetcode
leetcode 1451 ~ 1500
找到二叉树中最近的右侧节点

找到二叉树中最近的右侧节点

难度:

标签:

题目描述

代码结果

运行时间: 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,代码中并没有直接的机制来识别u是否存在于树中。整个遍历过程将会遍历所有节点直到队列为空。由于没有找到u,也就不会触发返回右侧节点的逻辑,最终函数将返回None。
🦆
在此题解中,对于非目标节点u的右侧节点处理逻辑是什么?例如,如果目标节点u是某一层的最后一个节点,该如何确保返回None?
在此题解中,对于每个出队的节点,会首先检查该节点是否为目标节点u。如果是,并且这个节点不是当前层的最后一个节点(即当前层还有其他节点未被处理),则返回队列中的下一个节点作为右侧节点。如果目标节点u是该层的最后一个节点,由于它是最后被处理的节点,执行`q[0]`将会因为队列为空而返回None。因此,如果u是某一层的最后一个节点,代码将自然地返回None,符合题目要求。
🦆
此算法在面对空树(root为None)的情况下是否还能正常运行?如果可以,其返回值是什么?
如果输入的树是空的(即root为None),由于算法一开始会将root节点加入队列,如果root为None,队列将初始化为空。在while循环的条件是队列非空,因此对于空树的情况,循环体内的代码不会执行,函数将直接结束并返回None。因此,此算法在面对空树时能正常运行,并返回None。

相关问题