当前位置: 首页 > ai >正文

力扣面试150题--填充每个节点的下一个右侧节点指针 II

Day 45

题目描述

在这里插入图片描述

思路

初次做法:考虑到每一节点都要指向它右边的第一个节点,那么我们需要从根向下,最好每次提前处理根节点指向它右边的节点,那么符合这样的遍历方法,很容易i想到前序遍历,但是前序遍历是有问题的,我们考虑以下样例:
在这里插入图片描述
如果我们采取前序遍历,在遍历到第四层的0这个点时,需要指向右边第一个节点,也就是8,但是此时它的父亲节点指向9,但是9并没有指向1,原因在于,我们并没有遍历到右子树的9号节点,因此此时0的next会指向null。
所以我们考虑遍历顺序变为根右左,先处理右子树,这样处理的好处是,由于每个节点都是不断指向右边的节点,先处理右子树,就会先处理好右子树的next,不会出现以上情况。
具体做法如下:

  1. 以下全是递归函数内容
  2. 判断该节点是否为空,为空返回null,非空继续。
  3. 如果该节点左孩子非空,判断该节点的右孩子是否为空,不为空就将该节点的左孩子next指向右孩子;为空,定义一个节点为该节点指向的next节点,判断next的左孩子和右孩子是否为空,为空就继续指向下一个next,直到为null,非空,就指向左孩子或者右孩子(优先左孩子),然后退出循环
  4. 如果该节点右孩子非空。同上
  5. 递归该节点的右孩子
  6. 递归该孩子的左孩子
/*
// 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 lian(Node root){//采取根右左if(root==null){//为空就返回nullreturn null;}if(root.left!=null){//左孩子不为空if(root.right!=null){//右孩子不为空就指向它root.left.next=root.right;}else{//右孩子为空if(root.next==null){//该节点的next指向为空,说明右边没有节点了root.left.next=null;}else{//不为空Node x=root.next;//新节点指向该节点的nextwhile(x!=null){//循环if(x.left==null&&x.right==null){//说明该节点没有能指向的孩子,继续下一个x=x.next;continue;}if(x.left!=null){//优先指向左孩子root.left.next=x.left;break;}if(x.right!=null){//再指向右孩子root.left.next=x.right;break;}}}}}if(root.right!=null){//基本同上if(root.next==null){root.right.next=null;}else{Node y=root.next;while(y!=null){if(y.left==null&&y.right==null){y=y.next;continue;}if(y.left!=null){root.right.next=y.left;break;}if(y.right!=null){root.right.next=y.right;break;}}}}lian(root.right);lian(root.left);return root;}public Node connect(Node root) {if(root==null){return null;}root.next=null;Node res= lian(root);return res;}
}

题解做法:直接采取层序遍历(居然没想到)

class Solution {public Node connect(Node root) {if (root == null) {return null;}Queue<Node> queue = new ArrayDeque<Node>();queue.offer(root);while (!queue.isEmpty()) {int n = queue.size();Node last = null;for (int i = 1; i <= n; ++i) {Node f = queue.poll();if (f.left != null) {queue.offer(f.left);}if (f.right != null) {queue.offer(f.right);}if (i != 1) {last.next = f;}last = f;}}return root;}
}
http://www.xdnf.cn/news/7842.html

相关文章:

  • SPI协议软件实现 W25QXX flash 存储器
  • 【写在创作纪念日】基于SpringBoot和PostGIS的各省东西南北四至极点区县可视化
  • C++函数重载
  • 2025年保姆级教程:Powershell命令补全、主题美化、文件夹美化及Git扩展
  • 线端子人工做线操作介绍
  • C++学习:六个月从基础到就业——多线程编程:条件变量
  • 诊断仪进行CAN采样点测试的原理
  • 管理会议最佳实践:高效协同与价值最大化
  • ctfhub技能书http协议
  • 2570. 合并两个二维数组 - 求和法
  • RTMP协议解析【三】
  • 【论文复现】——基于NDT与ICP结合的点云配准算法(matlab版)
  • 网页 HTML布局(详解)
  • 精益数据分析(74/126):从愿景到落地的精益开发路径——Rally的全流程管理实践
  • 新能源汽车充电桩资源如何利用资源高效配置?
  • Linux 内核音视频架构(V4L2 )介绍
  • 算法中的数学:欧拉函数
  • 工作流引擎-03-聊一聊什么是流程引擎(Process Engine)?
  • 用户缓冲区
  • JavaScript 函数、方法、限定符
  • 关于Vue自定义组件封装的属性/事件/插槽的透传问题
  • 密码合集(不定期更新)
  • 【VS2017】cpp文件字符编码异常导致编译报错
  • 老牌硬件检测工具的现代应用场景分析
  • 【动手学深度学习】1.3. 各种机器学习问题
  • spring的注入方式都有什么区别
  • 网页表格转换为markdown
  • 仅修改文件名会导致文件的MD5值发生变化吗?
  • 制造业ERP系统选型与实施避坑探讨
  • java加强 -网络编程