您现在的位置是:首页 >技术交流 >LeetCode_二叉树_BFS_中等_117.填充每个节点的下一个右侧节点指针 II网站首页技术交流

LeetCode_二叉树_BFS_中等_117.填充每个节点的下一个右侧节点指针 II

代码星辰 2024-08-28 12:01:03
简介LeetCode_二叉树_BFS_中等_117.填充每个节点的下一个右侧节点指针 II

1.题目

给定一个二叉树:

struct Node {
	int val;
	Node *left;
	Node *right;
	Node *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。初始状态下,所有 next 指针都被设置为 NULL。

示例 1:

在这里插入图片描述

输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。序列化输出按层序遍历顺序(由 next 指针连接),‘#’ 表示每层的末尾。

示例 2:
输入:root = []
输出:[]

提示:
树中的节点数在范围 [0, 6000] 内
-100 <= Node.val <= 100

进阶:
你只能使用常量级额外空间。
使用递归解题也符合要求,本题中递归程序的隐式栈空间不计入额外空间复杂度。

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii

2.思路

(1)BFS
思路参考该 LeetCode 用户题解

相关题目:
LeetCode_二叉树_中等_116.填充每个节点的下一个右侧节点指针

3.代码实现(Java)

//思路1————BFS
/*
// Definition for a Node.
class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {}
    
    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/
class Solution {
    public Node connect(Node root) {
        if (root == null) {
            return root;
        }
        Node curr = root;
        while (curr != null) {
            //定义当前层的虚拟节点
            Node dummy = new Node(-1);
            Node prev = dummy;
            while (curr != null) {
                if (curr.left != null) {
                    prev.next = curr.left;
                    prev = prev.next;
                }
                if (curr.right != null) {
                    prev.next = curr.right;
                    prev = prev.next;
                }
                curr = curr.next;
            }
            // curr 指向下一层的第一个节点
            curr = dummy.next;
        }
        return root;
    }
}
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。