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

[案例需求]

[思路分析一, 迭代法]

[代码实现]

/*
// 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) {//层序遍历, queue存储, Queue<Node> queue = new ArrayDeque<>();if(root == null)return root;queue.add(root);Node res = root;// 目的是每一层连接起来while(!queue.isEmpty()){int size = queue.size();for(int i = 0; i < size; i++){root = queue.poll();//把每一层的结点连接起来, 每一层最后一个结点除外if(i < size - 1)root.next = queue.peek();if(root.left != null)queue.add(root.left);if(root.right != null)queue.add(root.right);}}return res;}
}

[思路分析二, 递归实现]

/*
// 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 {//1. 递归函数: 连接同一层的结点, 参数: 以当前节点为根节点的结点;// 返回值:  返回的是被看做根节点的当前节点public Node connect(Node root) {//2. 递归结束条件if(root == null)return root;//3. 单层递归逻辑if(root.left != null){//3.1 连接一棵子树内的左右结点root.left.next = root.right;//3.2 连接不同子树之间的右结点和左结点//上层的next结点已经是已知的, 所以我们利用root.next获取到root右边的那棵子树if(root.next != null)root.right.next = root.next.left;}//4. 递归调用connect(root.left);connect(root.right);return root;}
}

lt.117. 填充每个节点的下一个右侧节点指针 II

[案例需求]

[思路分析一, 借助队列的层序遍历]

  • 毋庸多说, 这个解法跟上一题的思路完全一致

[代码实现]

/*
// 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 ArrayDeque<>();queue.add(root);Node res = root;while(!queue.isEmpty()){int size = queue.size();for(int i = 0; i < size; i++){root = queue.poll();if(i < size - 1){root.next = queue.peek();}if(root.left != null)queue.add(root.left);if(root.right != null)queue.add(root.right);}}return res;}
}

[思路分析二, ]

  • 空间复杂度为O(1)的解法:

  • 遍历每一层节点, 当前层的节点为 cur. 如果这个节点的左孩子,不为空, 那么我们可以把这个左孩子看做是链表, 把它连接到dummy为虚节点的链表中即可(具体来说就是使用temp遍历进行连接)

  • 代码的写法就是两个while循环, 外层的while循环负责整棵树的遍历, cur(当前层节点) 和 下一层链表 (dummy, temp)的向下移动;

  • 内层的while循环负责当前层cur 的遍历, 以及cur的左右孩子节点连接到链表中的操作;

  • 参考题解: 点我

[代码实现]

/*
// 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;//cur我们可以把它看做是每一层的链表Node cur = root;Node dummy = new Node(0);while (cur != null) {dummy.next = null;//遍历当前层的时候,为了方便操作在下一//层前面添加一个哑结点(注意这里是访问//当前层的节点,然后把下一层的节点串起来)//pre表示访下一层节点的前一个节点Node pre = dummy;//然后开始遍历当前层的链表while (cur != null) {if (cur.left != null) {//如果当前节点的左子节点不为空,就让pre节点//的next指向他,也就是把它串起来pre.next = cur.left;//然后再更新prepre = pre.next;}//同理参照左子树if (cur.right != null) {pre.next = cur.right;pre = pre.next;}//继续访问这样行的下一个节点cur = cur.next;}//把下一层串联成一个链表之后,让他赋值给cur,//后续继续循环,直到cur为空为止cur = dummy.next;}return root;}
}
class Solution {public Node connect(Node root) {//把每一层看做是一个链表. 当遍历当前层的时候, 把下一层当做链表连接起来;if(root == null)return root;Node dummy = new Node(-1);Node cur = root;while(cur != null){Node temp = dummy;dummy.next = null; // 跟上一层的链表撇清关系//当前层.// 如果当前节点的左孩子不为空, 就用dummy所在的链表连接起来, 同理右孩子也是如此while(cur != null){if(cur.left != null){temp.next = cur.left;temp = temp.next;}if(cur.right != null){temp.next = cur.right;temp = temp.next;}cur = cur.next;}//转到当前层的下一层进行遍历cur = dummy.next;}return root;}
}

2.<tag-二叉树和层序遍历相关题>-lt.116. 填充每个节点的下一个右侧节点指针 + lt.117. 填充每个节点的下一个右侧节点指针 II 1相关推荐

  1. 牛客题霸 [ 求二叉树的层序遍历] C++题解/答案

    牛客题霸 [ 求二叉树的层序遍历] C++题解/答案 题目描述 给定一个二叉树,返回该二叉树层序遍历的结果,(从左到右,一层一层地遍历) 例如: 给定的二叉树是{3,9,20,#,#,15,7}, 该 ...

  2. [Leedcode][JAVA][第102题][二叉树的层序遍历][递归][迭代][BFS]

    [问题描述][第102题][二叉树的层序遍历][中等] 给你一个二叉树,请你返回其按 层序遍历 得到的节点值. (即逐层地,从左到右访问所有节点).示例: 二叉树:[3,9,20,null,null, ...

  3. 力扣刷题之二叉树的层序遍历

                                                      Welcome to you, 每日一刷系列 二叉树的层序遍历 二叉树的层序遍历II 二叉树的右视图 ...

  4. 【手把手带你刷好题】—— 48.二叉树的层序遍历(BFS)

    [前言] 今天是刷题打卡第48天! 早成者未必有成,晚达者未必不达.一起都还来得及,加油哦. 原题: 二叉树的层序遍历(BFS) 原题链接:力扣 示例: 代码执行: class Solution { ...

  5. 刷题笔记(十四)--二叉树:层序遍历和DFS,BFS

    目录 系列文章目录 前言 题录 102. 二叉树的层序遍历 BFS DFS_前序遍历 107. 二叉树的层序遍历 II BFS DFS 199. 二叉树的右视图 BFS DFS 637. 二叉树的层平 ...

  6. 刷题记录8---验证二叉搜索树+二叉树的层序遍历+从前序与中序遍历序列构造二叉树+二叉树展开为链表+二叉树的最近公共祖先

    前言 所有题目均来自力扣题库中的hot 100,之所以要记录在这里,只是方便后续复习 98.验证二叉搜索树 题目: 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树. 有效 二叉搜 ...

  7. 二叉树层序遍历相关题目

    前言 102.二叉树的层序遍历 题目描述 前提知识 代码 107二叉树的层序遍历II 题目描述 代码 199.二叉树的右视图 题目描述 思路 代码 637.二叉树的层平均值 题目描述 思路 代码 42 ...

  8. 遍历children_二叉树:层序遍历登场!

    登场之后,我要打十个! 看完这篇文章虽然不能打十个,但是可以迅速打五个!而且够快! 102.二叉树的层序遍历 给你一个二叉树,请你返回其按 层序遍历 得到的节点值.(即逐层地,从左到右访问所有节点). ...

  9. 代码随想录算法训练营Day15|Leetcode102二叉树的层序遍历、Leetcode226翻转二叉树、Leetcode101对称二叉树

    Day15打卡! 时长:2h 今日感想:今天主要学习了二叉树层次遍历的思路方法和应用.题目看似简单,实则有很多细节,有时间可以做做其他相似的推荐题目~ Leetcode102 二叉树的层序遍历 题目链 ...

最新文章

  1. 区分主机 cpu 计算机及计算机系统,小学计算机教案(二)
  2. 【洛谷 P4051】 [JSOI2007]字符加密(后缀数组)
  3. some demos
  4. php 邮件发送是html 没样式_使用python发送邮件
  5. jquery Datatables 行数据删除、行上升、行下降功能演示
  6. 【硬件解码系列】之DXVA2
  7. webpack4开始使用
  8. Axis2在eclipse和tomcat下的配置
  9. 语音识别系统原理介绍----gmm-hmm
  10. Linux系统中用源代码编译安装软件和查看进程
  11. 计算机播放音乐自录,如何录制电脑内部播放的声音及音乐
  12. android edittext 英文数字键盘,Adroid EditText限制输入数字与英文默认弹出数字键盘...
  13. matlab如何看历史,matlab创建有价值历史纪录.txt 源代码在线查看 - Matlab创建有价值历史纪录(完整版),matlab 常用的命令集锦。 资源下载 虫虫电子下载站...
  14. /专访/对话堵俊平:最好的开源生态模型,是亚马逊的原始森林
  15. poj 1436 Horizontally Visible Segments(线段树)
  16. 上古卷轴5:重制版窗口化运行1920*1080画面显示不全的问题解决
  17. 看完这篇人工智能的文章,能帮你超越90%的人
  18. c++并发编程(concurrency)----线程管理
  19. FileSaver.js下载图片
  20. ESD的防护要求和器件注意事项

热门文章

  1. 刻苦加技巧促成SAT阅读飞跃进步
  2. BlueStacks安卓模拟器屏幕窗口大小的调整方法
  3. mysql 启动报错 ERROR The server quit without updating PID file
  4. Excel合并多个单元格内容
  5. 吉林省白山市谷歌高清卫星地图下载
  6. 求稳!法拉第未来宣布将缩减建厂规模和产能
  7. centos7使用testdisk7.1恢复误删除的文件,要求给出详细可行的教程详细并说明注意点...
  8. linux系统数据恢复TestDisk,如何用testdisk恢复文件 Linux已删除的文件如何恢复
  9. 红米android system干什么的,Android System Webview是什么东西
  10. 蕉下手里的「防晒牌」,还管用吗?