LeetCode - Medium - 116,有备无患

Initially, all next pointers are set to NULL.

Follow up:

  • You may only use constant extra space.

  • Recursive approach is fine, you may assume implicit stack space does not count as extra space for this problem.

Example 1:

Input: root = [1,2,3,4,5,6,7]

Output: [1,#,2,3,#,4,5,6,7,#]

Explanation: Given the above perfect binary tree (Figure A), your function should populate each next pointer to point to its next right node, just like in Figure B. The serialized output is in level order as connected by the next pointers, with ‘#’ signifying the end of each level.

Constraints:

  • The number of nodes in the given tree is less than 4096.

  • -1000 <= node.val <= 1000

Analysis


方法一:DFS,但递归会用到隐式非常量额外空间,不符题意。

方法二:BFS,但用到非常量额外空间的队列,不符题意。

方法三:子节点们利用父节点的next进行连接。

Submission


import java.util.ArrayList;

import java.util.LinkedList;

import java.util.List;

public class PopulatingNextRightPointersInEachNode {

public static 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;

}

};

// 方法一:DFS

public Node connect(Node root) {

if (root == null)

return root;

connect(root, 0, new ArrayList<>());

return root;

}

private void connect(Node node, int level, List prevs) {

if (node == null)

return;

if (prevs.size() == level) {

prevs.add(node);

} else {

Node prev = prevs.get(level);

prev.next = node;

prevs.set(level, node);

}

connect(node.left, level + 1, prevs);

connect(node.right, level + 1, prevs);

}

// 方法二:BFS

public Node connect2(Node root) {

if (root == null)

return root;

LinkedList queue = new LinkedList<>();

queue.offer(root);

while (!queue.isEmpty()) {

Node prev = null;

for (int size = queue.size(); size > 0; size–) {

Node node = queue.poll();

if (prev != null) {

prev.next = node;

}

prev = node;

if (node.left != null)

queue.offer(node.left);

if (node.right != null)

queue.offer(node.right);

}

}

return root;

}

// 方法三:利用父节点的next

public Node connect3(Node root) {

if (root == null)

return null;

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

前端资料汇总

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

我一直觉得技术面试不是考试,考前背背题,发给你一张考卷,答完交卷等通知。

首先,技术面试是一个 认识自己 的过程,知道自己和外面世界的差距。

更重要的是,技术面试是一个双向了解的过程,要让对方发现你的闪光点,同时也要 试图去找到对方的闪光点,因为他以后可能就是你的同事或者领导,所以,面试官问你有什么问题的时候,不要说没有了,要去试图了解他的工作内容、了解这个团队的氛围。
找工作无非就是看三点:和什么人、做什么事、给多少钱,要给这三者在自己的心里划分一个比例。
最后,祝愿大家在这并不友好的环境下都能找到自己心仪的归宿。
我一直觉得技术面试不是考试,考前背背题,发给你一张考卷,答完交卷等通知。

首先,技术面试是一个 认识自己 的过程,知道自己和外面世界的差距。

更重要的是,技术面试是一个双向了解的过程,要让对方发现你的闪光点,同时也要 试图去找到对方的闪光点,因为他以后可能就是你的同事或者领导,所以,面试官问你有什么问题的时候,不要说没有了,要去试图了解他的工作内容、了解这个团队的氛围。
找工作无非就是看三点:和什么人、做什么事、给多少钱,要给这三者在自己的心里划分一个比例。
最后,祝愿大家在这并不友好的环境下都能找到自己心仪的归宿。

  • 15
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值