前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【一天一大 lee】填充每个节点的下一个右侧节点指针 II (难度:中等) - Day20200928

【一天一大 lee】填充每个节点的下一个右侧节点指针 II (难度:中等) - Day20200928

作者头像
前端小书童
发布2020-09-29 20:20:28
2710
发布2020-09-29 20:20:28
举报
文章被收录于专栏:前端小书童前端小书童

题目:[1]

给定一个二叉树

代码语言:javascript
复制
struct Node {
  int val;
  Node *left;
  Node *right;
  Node *next;
}

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

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

进阶:

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

示例:

示例

代码语言:javascript
复制
输入:root = [1,2,3,4,5,null,7]
输出:[1,#,2,3,#,4,5,7,#]
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。

提示:

  • 树中的节点数小于 6000
  • -100 <= node.val <= 100

抛砖引玉

层次遍历

思路

广度优先遍历(BFS)

遍历中集中处理每一层的数据,注意题目中要求:

  • next 指向下一个 right 节点
  • 优先存在左节点
  • 在处理时[a,b],a.next=b
代码语言:javascript
复制
/**
 * // 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 == null) return null
  let queue = [root]
  while (queue.length) {
    let len = queue.length,
      last = null
    for (let i = 1; i <= len; ++i) {
      let node = queue.shift()
      if (node.left) queue.push(node.left)
      if (node.right) queue.push(node.right)
      if (i !== 1) last.next = node
      last = node
    }
  }
  return root
}

使用已建立的 next 指针

从根节点开始逐个构建下一层的 next,构建后同层借助 next 构建,同层构建完成借助 right、left 开启下一层。

代码语言:javascript
复制
var connect = function(root) {
  if (root == null) return null
  let start = root, // 上一层构建next的触发点
    nextStart = null, // 下一轮构建next的触发点
    perv = null // 上一轮后构建的节点

  while (start) {
    // 开启新一层时 上一轮后构建的节点修改为null
    perv = null
    nextStart = null
    // 遍历的指针在同层节点中通过 next 连接(在遍历重来中构建了next,开启下次遍历时使用构建的next改变指针)
    for (let p = start; p; p = p.next) {
      // 先构建left,刷新perv 再构建right
      if (p.left) helper(p.left)
      if (p.right) helper(p.right)
    }
    // 更新触发点
    start = nextStart
  }

  function helper(p) {
    if (perv) perv.next = p
    if (nextStart == null) nextStart = p
    perv = p
  }
  return root
}
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-09-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端小书童 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 抛砖引玉
    • 层次遍历
      • 使用已建立的 next 指针
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档