力扣每日一题117:填充每个节点的下一个右侧结点指针||

文章讲述了如何使用next指针在二叉树中实现层序遍历,避免了传统方法所需的额外队列空间,将空间复杂度降低到O(1),通过递归和链表结构简化操作。
摘要由CSDN通过智能技术生成

题目

中等

给定一个二叉树:

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

进阶:

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

面试中遇到过这道题?

1/5

通过次数

256.1K

提交次数

370.2K

通过率

69.2%

思路:用next指针练成链表来代替队列的功能,同时进行层序遍历。

普通用队列来进行层序遍历的方法相信大家都知道,但是这需要O(n)的空间复杂度。

队列的功能主要是记录下一层的结点顺序,然后依次遍历。现在每个节点都有一个next指针,如果我们在遍历某一层时,先将下一层的next的指针连好,那么我们只需要从下一层的第一个结点开始,沿着next指针,就可以按顺序遍历下一层的结点,也就不需要队列的额外空间了。空间复杂度就变成了O(1)。

class Solution {
public:
    void attach(Node* &p,Node* &last,Node* &nextStart){
        if(!nextStart){
            nextStart=p;
        }
        if(last){
            last->next=p;
        }
        last=p;
    }
    Node* connect(Node* root) {
        if(root==NULL) return root;
        Node* start=root;//当前层的第一个位置
        while(start){
            Node* last=nullptr,*nextStart=nullptr;//下一层的最后一个位置和第一个位置
            //用next指针构成的链表代替队列
            for(Node* p=start;p;p=p->next){
                if(p->left){
                    attach(p->left,last,nextStart);
                }
                if(p->right){
                    attach(p->right,last,nextStart);
                }
            }
            start=nextStart;
        }
        return root;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值