力扣【广度搜索专题】👊 117. 填充每个节点的下一个右侧节点指针 II

244 阅读1分钟

「这是我参与2022首次更文挑战的第 21 天,活动详情查看:2022首次更文挑战

题目链接

117. 填充每个节点的下一个右侧节点指针 II - 力扣(LeetCode) (leetcode-cn.com)

题目描述

给定一个二叉树

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

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

初始状态下,所有 next 指针都被设置为 NULL。

测试用例

示例 1:

image.png

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

条件限制

  • 树中的节点数小于 6000
  • -100 <= node.val <= 100

题目分析

题目需要我们为树中的每一个节点添加一个右侧节点的指向,这种指向只存在同层的节点依次向右引用,那么用广度搜索的思路来获取到每层的节点,使用一个临时变量 temp=null 表示在当前层中,上一个节点的引用,然后从右往左遍历处理元素,细节为:令当前元素的 next 引用指向 temp,然后再修改 temp 的引用为当前元素,然后进入下一次迭代处理

其中有个注意项:因为我们为了给节点指定 next 引用需要从右往左遍历数组中的节点,那么再将节点的左右子节点存入到数组时,应当将子节点添加至数组的开头,并且是先添加右子节点,再添加左子结点

代码实现

var connect = function(root) {
    if (root == null) return root;
    let arr = [root],
        len = arr.length;
    while (len > 0) {
        let last = null;
        for (; len > 0; len--) {
            let curr = arr.pop();
            curr.next = last;
            last = curr;
            if (curr.right != null) arr.unshift(curr.right);
            if (curr.left != null) arr.unshift(curr.left);
        }
        len = arr.length;
    }
};

image.png

这道题只要理清楚节点的遍历顺序以及子节点的添加顺序即可很轻易的解决