ts算法题解(第42天)---leetcode 116. 填充每个节点的下一个右侧节点指针

115 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

前言

每天一道算法题,死磕算法

题目

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

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

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

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

题解

image.png

示例1:

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

分析

1. 从题目中提取关键字

  • 给的是一个完美二叉树,那说明给的是一个正三角形的二叉树,除了最右侧的二叉树的next指向null以外,其他节点的next都有值

2.这道题目的难点在哪里?

image.png

如果只是实现相同父节点下面的左节点的next指向右节点,那么这道题目就简单了,而这道题目的复杂之处就是节点5的next要指向节点6,这就复杂了,因为他们根本不在一个父节点下面

所以我们要想办法,如果让5的next指向6

因为2和3在同一层,所以5指向6也就是节点2的right指向节点3的left

所以除了遍历相同父节点子节点以外,还需要遍历左子树的右节点,和右子树的左节点

题解

function traverse(node1:Node,node2:Node){
    if(!node1 || !node2){
        return;
    }
    node1.next = node2;
    traverse(node1.left,node1.right);
    traverse(node2.left,node2.right);
    traverse(node1.right,node2.left);
}

function connect(root: Node | null): Node | null {
    if(root === null){
        return null;
    }
    traverse(root.left,root.right);
    return root;
};

参考