力扣刷题笔记 → 116. 填充每个节点的下一个右侧节点指针

122 阅读1分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

题目

给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:

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

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

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

 

进阶

  • 你只能使用常量级额外空间。
  • 使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。

示例

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

提示

  • 树中节点的数量少于 4096
  • -1000 <= node.val <= 1000

解题思路

层级遍历,节点关联

由于该树结构中没有上一节点,我们在当前节点所能获取到到只有自身到左节点和右节点,而无法直接获取到兄弟节点。

image.png

因此我们必须先通过父节点将其左右节点进行关联。但这种情况只适合一个层级的场景,如果是多级场景,我们还需要将当前节点的右节点关联只下一节点的左节点,那么这时就无法通过父节点直接进行关联了。

image.png

这时我们应该怎么做呢?考虑到该右节点需要进行关联到场景,那么其父节点必定为已关联下一兄弟节点,我们能否利用这一特性做点啥呢?

image.png

通过父节点到下一节点,我可以直接获取到其左节点,此时,我们即可将该右节点与其进行关联,示例代码为:

node.right = node.next.left

最终我们实现到效果如下:

  1. 现将当前节点到左节点与右节点关联;
  2. 再获取下一节点到左节点,将右节点与其进行关联。
class Solution {
    public Node connect(Node root) {
        Node head = root;
        while(null != head){
            Node node = head;
            while(null != node){
                // 左节点不为空,则关联右节点
                if(null != node.left){
                    node.left.next = node.right;
                }

                // 右节点不为空,并且下一节点不为空,则将右节点关联下一节点到左节点
                if(null != node.right && null != node.next){
                    node.right.next = node.next.left;
                }
                // 指针后移,反复执行关联操作
                node = node.next;
            }
            // 指针跳转到下一行首位元素
            head = head.left;
        }
        
        // 返回结果
        return root;
    }
}

 复杂度分析

  •   时间复杂度:O(N)O(N)
  •   空间复杂度:O(1)O(1)

最后

文章有写的不好的地方,请大佬们不吝赐教,错误是最能让人成长的,愿我与大佬间的距离逐渐缩短!

如果觉得文章对你有帮助,请 点赞、收藏、关注、评论 一键四连支持,你的支持就是我创作最大的动力!!!

题目出处: leetcode-cn.com/problems/po…