https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/

难度:中等


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

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

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

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

示例:


  首先,给定的树是一棵完美二叉树,因此对于所有非叶子节点的节点,都会有左右孩子。

解法1:层次优先遍历

  由于每个节点的 next 指针都是指向当前层次的右边节点,因此很容易想到使用层次优先遍历,且由于是完美二叉树,每层的节点个数也很容易计算出来(即都是 2 的倍数)。

  具体做法是使用一个队列,从右到左往队列中添加节点,这样,除了最右侧节点,其他节点在出队时将其 next 指向上一个出队节点即可。

JS 代码如下:

/*** // Definition for a Node.* function Node(val, left, right, next) {*    this.val = val === undefined ? null : val;*    this.left = left === undefined ? null : left;*    this.right = right === undefined ? null : right;*    this.next = next === undefined ? null : next;* };*//*** @param {Node} root* @return {Node}*/
var connect = function(root) {if (!root) {return root;}let queue = [];let last, cur;let n = 0, nums = 1;queue.push(root);while (queue.length) {cur = queue.shift();n++;if (last) {cur.next = last;}if (cur.right) {queue.push(cur.right);}if (cur.left) {queue.push(cur.left);}last = cur;if (n === nums) {nums *= 2;n = 0;last = null;}}return root;
};

解法2:使用父节点 next 指针

  首先,如下图,对于当前遍历到的节点 2,我们能够很容易的找到其左孩子的 next 指针所指向的节点(即其右孩子):root.left.next = root.right;

  而对于其右孩子 5,由于我们在遍历根结点 1 时就设置了节点 2next 指针,因此我们能够使用节点 2next 来找到节点 5next 所要指向的右侧节点:root.right.next = root.next.left;

  根据这种思路,我们能够写出递归版本和迭代版本的代码:

递归

  递归版本很直观,就是按照上面的两种情况来的:

var connect = function(root) {if (!root) {return root;}const dfs = (root) => {if (!root) {return;}if (root.left) {root.left.next = root.right;// 若当前节点不是最右侧节点,那么可以通过 next 指针找到其右侧节点if (root.next) {root.right.next = root.next.left;}}dfs(root.left);dfs(root.right);};dfs(root);return root;
};

迭代

  对于迭代法,我们可以从每一层最左边的节点出发,对每一个遍历到的节点的左右孩子,按照上面的两种情况来获取 next 的指向:

var connect = function(root) {if (!root) {return root;}let leftSide = root;while (leftSide.left) {let node = leftSide;while (node) {node.left.next = node.right;if (node.next) {node.right.next = node.next.left;}node = node.next;}leftSide = leftSide.left;}return root;
};

LeetCode 116. 填充每个节点的下一个右侧节点指针相关推荐

  1. 力扣116. 填充每个节点的下一个右侧节点指针(C++,附思路)

    题目链接在这里: 116. 填充每个节点的下一个右侧节点指针 - 力扣(LeetCode) (leetcode-cn.com)https://leetcode-cn.com/problems/popu ...

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

    lt.116. 填充每个节点的下一个右侧节点指针 [案例需求] [思路分析一, 迭代法] [代码实现] /* // Definition for a Node. class Node {public ...

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

    2020-05-28 1.题目描述 填充每个节点的下一个右侧节点指针 2.题解 层次遍历即可 3.代码 /* // Definition for a Node. class Node { public ...

  4. 二叉树:填充每个节点的下一个右侧节点指针(java)

    leetcode116:填充每个节点的下一个右侧节点指针 leetcode原题链接: 题目描述 递归解法一 递归方法二(效率更高) 二叉树专题 leetcode原题链接: 116题:填充每个节点的下一 ...

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

    116. 填充每个节点的下一个右侧节点指针 难度中等128 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: struct Node {int val;Node ...

  6. 力扣 填充每个节点的下一个右侧节点指针

    填充每个节点的下一个右侧节点指针 题目描述 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: struct Node { int val; Node *left ...

  7. [leetcode-117]填充每个节点的下一个右侧节点指针 II

    (1 AC) 填充每个节点的下一个右侧节点指针 I是完美二叉树.这个是任意二叉树 给定一个二叉树 struct Node {int val;Node *left;Node *right;Node *n ...

  8. leetcode系列-116.填充每个节点的下一个右侧节点指针

    题目描述: 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点. 二叉树定义如下: struct Node {int val;Node *left;Node *right;No ...

  9. LeetCode 116. 填充每个节点的下一个右侧节点指针(递归循环)

    文章目录 1. 题目 2. 解题 2.1 递归 2.2 循环 2.3 O(1)空间复杂度 1. 题目 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: stru ...

最新文章

  1. IoT机会窗打开:运营商亟需战略转型 获取物联网最大化价值
  2. Storyboard更改layer层属性
  3. IT人士的知识管理-第一篇
  4. 如何保证电子邮件的安全
  5. IBASE header status
  6. RISC-V,芯片中的网红战斗机,究竟是个什么鬼
  7. mysql服务器默认操作字符集,如何在mysql中找到默认服务器字符集?
  8. python文件下载速度 装饰器_python使用装饰器对文件进行读写操作'及遍历文件目录...
  9. Android应用开发提高篇(2)-----文本朗读TTS(TextToSpeech)
  10. Cent OS home下中文目录改成英文目录
  11. 【Deep Learning 二】课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)答案
  12. web前端课程课件汇总
  13. 航迹推演(Odometry)
  14. 2018秋招面经-后端开发
  15. IT人才异军突起 有招网引领业界精英
  16. go 链路追踪_Golang在七牛全链路追踪中的实践
  17. MATLAB命令大全和矩阵操作大全
  18. python画鱼教程_Python Flask高级编程之从0到1开发《鱼书》精品项目 学习 教程??
  19. 漫画:二叉树系列 第五讲(BST的删除)
  20. IDEA插件 阿里巴Java编码指南插件支持

热门文章

  1. Truncate 删除数据
  2. nagios 使用MSN 发报警消息
  3. vivo 亿级优惠券系统架构设计与实践
  4. HashMap的31连环炮,我倒在第5个上
  5. 精通Zookeeper系列开篇:进大厂不得不学的分布式协同利器!
  6. 某女网友吐槽:大厂程序员男友太忙,天天当望夫石或者床头灯!已分手!
  7. 数据库架构优化的12种组合方式与风险解读
  8. 一步一图,带你重头梳理微服务架构!
  9. 基于深度学习的可疑活动视频分析
  10. Finding the Edges (Sobel Operator)