Populating Next Right Pointers in Each Node I II@LeetCode
Populating Next Right Pointers in Each Node I
树的广度优先搜索题。记录下每一层的节点总个数,然后根据广度优先搜索的原则进行遍历,将非null
节点都加入到队列中,对于同一层中的节点,将其next
指向队列中的下一个节点即可。
实现代码:
java
public class Solution { public void connect(TreeLinkNode root) { if (root == null) return; LinkedList<TreeLinkNode> nodes = new LinkedList<TreeLinkNode>(); nodes.add(root); int numOfLevelTotal = 1; while (!nodes.isEmpty()) { TreeLinkNode treeLinkNode = nodes.poll(); numOfLevelTotal--; if (treeLinkNode.left != null) { nodes.add(treeLinkNode.left); } if (treeLinkNode.right != null) { nodes.add(treeLinkNode.right); } if (numOfLevelTotal > 0) { treeLinkNode.next = nodes.getFirst(); } else { numOfLevelTotal = nodes.size(); } } } }
Populating Next Right Pointers in Each Node II
根据题目来说,这一题和上一次的区别在于:
What if the given tree could be any binary tree? Would your previous solution still work?
但是由于之前所采用的方法并没有这种局限,所以直接拷贝过来也可以AC
。
不过这里存在一个问题,仔细看题目里的要求:
You may only use constant extra space.
理论上,采用队列的话是肯定没办法只是用常数额外内存的,但是LeetCode好像在这件事上没有检测的这么严,起码我写的Java代码和我看到的用递归解决的C++代码都可以通过。
那么如果硬要纠结一下这一条呢?不使用队列怎么做?
其实也不难,只是思路要转变一下,就不能是遍历这一层同时连接这一层,而是遍历这一层连接下一层。那么比较重要的就是要记录每一层的头节点,由于每一层在被遍历的时候是已经连接好了的,所以不必担心找不到节点的问题,如果挨个找寻next
节点的子节点即可,子节点先内部(相同父节点)连接,然后再连接到总链表中即可。
实现代码:
java
public class Solution { public void connect(TreeLinkNode root) { TreeLinkNode levelHead = root, nextLevelHead = null; while (levelHead != null) { TreeLinkNode node = levelHead, tail = null; while (node != null) { if (node.left != null && node.right != null) { node.left.next = node.right; } TreeLinkNode sub; if (node.left != null) sub = node.left; else if (node.right != null) sub = node.right; else sub = null; if (sub != null) { if (nextLevelHead == null) { nextLevelHead = sub; tail = sub; } else { tail.next = sub; } while (tail.next != null) tail = tail.next; } node = node.next; } levelHead = nextLevelHead; nextLevelHead = null; } } }
1.1k 声望
64 粉丝
推荐阅读
关于 C++ vector 的两个小 tips
本来这篇文章标题我想起成《关于 vector 的两个小坑》,后来想想,其实也不算是坑,还是自己对原理性的东西理解的没做那么透彻。工作中遇到的很多问题,后来归根到底都是基础不牢靠。
findingea阅读 1.5k
【每日一题】T 秒后青蛙的位置
1377. T 秒后青蛙的位置关键词:深度优先题目来源:1377. T 秒后青蛙的位置 - 力扣(Leetcode)题目描述 {代码...} 给你一棵由 n 个顶点组成的无向树,顶点编号从 1 到 n。青蛙从 顶点 1 开始起跳。规则如下:在...
字节幺零二四阅读 669
【算法竞赛】力扣周赛(节选)2022-04-30
力扣周赛(节选)2022-04-306404. 将数组清空关键词:树状数组、找规律题目来源:6404. 将数组清空 - 力扣(Leetcode)——力扣第 103 场双周赛第4题题目描述 {代码...} 给你一个包含若干 互不相同 整数的数组 nums...
字节幺零二四阅读 649
【每日一题】翻转子数组得到最大的数组值
给你一个整数数组 nums 。「数组值」定义为所有满足 0 <= i < nums.length-1 的 |nums[i]-nums[i+1]| 的和。
字节幺零二四阅读 601
【每日一题】摘水果
在一个无限的 x 坐标轴上,有许多水果分布在其中某些位置。给你一个二维整数数组 fruits ,其中 fruits[i] = [positioni, amounti] 表示共有 amounti 个水果放置在 positioni 上。fruits 已经按 positioni 升序排...
字节幺零二四阅读 535
leetcode 2413 最小偶倍数
今天这题比较简单,一行代码就解决了,思路其实简单,就是判断下当前数的奇偶性,如果是偶数,那么最小公倍数肯定就是数本身;如果是奇数,那么就是两个数的乘积。
MMzhe阅读 465
【每日一题】使二叉树所有路径值相等的最小代价
给你一个整数 n 表示一棵 满二叉树 里面节点的数目,节点编号从 1 到 n 。根节点编号为 1 ,树中每个非叶子节点 i 都有两个孩子,分别是左孩子 2 * i 和右孩子 2 * i + 1 。
字节幺零二四阅读 458
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。