首页 > 其他分享 >10_填充每个节点的下一个右侧节点指针

10_填充每个节点的下一个右侧节点指针

时间:2023-11-24 11:34:09浏览次数:30  
标签:Node 10 val next queue 节点 public 指针

填充每个节点的下一个右侧节点指针

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

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

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

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

示例 1:

img

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

示例 2:

输入:root = []
输出:[]

提示:

  • 树中节点的数量在 [0, 212 - 1] 范围内
  • -1000 <= node.val <= 1000

【思路】利用层次遍历,让每个节点的next域指向辅助队列的peek位置即可,因为题目说到了初始状态下,每个节点的next域都是null。

/*
// 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;
        Queue<Node> queue = new LinkedList<>();
        // 初始化队列同时将第一层节点加入队列中,即根节点
        queue.add(root);
        while (!queue.isEmpty()) {
             // 记录当前队列大小
            int levelSize = queue.size();
            for (int i = 0; i < levelSize; i++) {
                Node tmp = queue.poll();
                if (tmp.left != null)
                    queue.add(tmp.left);
                if (tmp.right != null) {
                    queue.add(tmp.right);
                }
                //  确实很巧妙,这个操作可以做到让tmp的next的指针域指向队列中的下一个节点。
                // 注意审题,题目中提到了所有节点的next初始都为null,因此并不需要考虑每层的最后一个节点做特殊的处理
                //  而且通过levelSize-1保证了不会指向下一层,next指向本层的元素的值
                if (i < levelSize-1) {
                    tmp.next = queue.peek();
                }
            }
        }
        return root;
    }
}

标签:Node,10,val,next,queue,节点,public,指针
From: https://www.cnblogs.com/codingbao/p/17853363.html

相关文章

  • surface pro4 鼠标指针闪烁、触摸屏不灵
    同事的平板长时间不用。出现:鼠标指标闪烁,触摸屏不灵的情况。尝试:一、更新系统问题依然出现二、调整各种设置总是依然出现三、百度到一篇可能是设备冲突禁用人机接口中的第一个“符合HID标准的触摸屏”总是解决。各文中提到的现象不完全一致,但类似。猜想可能是设备冲突引......
  • 【转载】Qt中的智能指针
    不用到处找了,附高质量博客链接Qt智能指针介绍:QSharedPointer、QWeakPointer、QScopedPointer、QPointer(附实例)-CSDN博客Qt智能指针信号槽连接问题_qtconnect智能指针_Jason~shen的博客-CSDN博客......
  • 2023版 STM32实战6 输出比较(PWM)包含F407/F103方式
    输出比较简介和特性-1-只有通用/高级定时器才能输出PWM-2-占空比就是高电平所占的比例-3-输出比较就是输出不同占空比的信号 工作方式说明 -1-1-PWM工作模式  -1-2-有效/无效电平 有效电平可以设置为高或低电平,是自己配置的 周期选择与计算 周期=重装载......
  • win10 windows11 更新失败 更新报错
     cmd管理员模式运行依次运行如下命令后再尝试更新netstopwuauservnetStopcryptSvcnetStopbitsnetStopmsiserverrenC:\Windows\SoftwareDistributionSDistribution.oldrenC:\Windows\System32\catroot2Catroot2.oldnetStartwuauservnetstartcryptS......
  • C++ 指针进阶:动态分配内存
    C++动态实例化(new和malloc)目录C++动态实例化(new和malloc)malloc/free工作原理具体使用动态创建一维数组动态创建二维数组callocreallocnew/delete工作原理具体应用动态实例化动态创建数组动态创建二维数组malloc和new的主要区别malloc/free工作原理malloc是......
  • 初中英语优秀范文100篇-006 The Person I Admire Most
    记忆树1ThepersonIadmiremostismyfather.翻译我最崇拜的人是我的父亲。简化记忆最崇拜的人句子结构主句:ThepersonIadmiremostismyfather.主语:Theperson(这个人)。谓语:is(是)。定语从句:Iadmiremost(我最崇拜的)修饰主语Theperson,表示“这个人”是我最崇拜......
  • 节点重启后初始化dpvs
    #加载大页内存echo2048>/sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepagesmount-thugetlbfsnodev/mnt/huge#加载vfio驱动modprobevfio-pci/usr/bin/chmoda+x/dev/vfio/usr/bin/chmod0666/dev/vfio/*echo1>/sys/module/vfio/param......
  • 印度程序员指针部分部分代码
    #include"stdio.h"intmain(){ intx=5; int*p=&x; *p=6;//可以不改变x的值来修改输出 int*(*q)=&p;//即p=*q int*(*(*r))=&q;//即r=*p printf("%d\n",*p); printf("%d\n",*q); printf("%d\n",**q);//即*p pr......
  • c++本质:释放内存、new与delete、容器内是指针
    【释放内存】本质:标识符放弃对该内存的占有权。若该内存是栈内存,当所有标识符都放弃,那么系统自动重获占有权。内存依然存在,地址、值都未改变。若该内存是堆内存,当所有标识符都放弃,不delete,那么系统也无法拥有占有权。所以delete让系统重获占有权。内存依然存在,地址未变、值变为......
  • 十四、指针和引用(四)
    十四、指针和引用(四)1、字符处理(字符串)1)字符串​ 日常生活中,单个字符无法满足我们的需求,比如一个单词hello要由五个字符组成,名字张三要由两个中文字符来组成,我们把这种连续的字符称为字符串,字符串在内存中的表现就是连续的字符。比如hello在内存中是这样子的。​ 注:字符在内存......