C++实现LeetCode(116.每个节点的右向指针)
[LeetCode] 116. Populating Next Right Pointers in Each Node 每个节点的右向指针
【C++实现LeetCode(116.每个节点的右向指针)】You are given a perfect binary tree where all leaves are on the same level, and every parent has two children. The binary tree has the following definition:
struct Node {Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL.
int val;
Node *left;
Node *right;
Node *next;
}
Initially, all next pointers are set to NULL.
Example:
文章图片
Input: {"$id":"1","left":{"$id":"2","left":"$id":"3","left":null,"next":null,"right":null,"val":4},"next":null,"right":{"$id":"4","left":null,"next":null,"right":null,"val":5},"val":2},"next":null,"right":{"$id":"5","left":{"$id":"6","left":null,"next":null,"right":null,"val":6},"next":null,"right":{"$id":"7","left":null,"next":null,"right":null,"val":7},"val":3},"val":1}Note:
Output: {"$id":"1","left":{"$id":"2","left":{"$id":"3","left":null,"next":{"$id":"4","left":null,"next":{"$id":"5","left":null,"next":{"$id":"6","left":null,"next":null,"right":null,"val":7},"right":null,"val":6},"right":null,"val":5},"right":null,"val":4},"next":{"$id":"7","left":{"$ref":"5"},"next":null,"right":{"$ref":"6"},"val":3},"right":{"$ref":"4"},"val":2},"next":null,"right":{"$ref":"7"},"val":1}
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.
- You may only use constant extra space.
- Recursive approach is fine, implicit stack space does not count as extra space for this problem.
解法一:
class Solution {public:Node* connect(Node* root) {if (!root) return NULL; if (root->left) root->left->next = root->right; if (root->right) root->right->next = root->next? root->next->left : NULL; connect(root->left); connect(root->right); return root; }};
对于非递归的解法要稍微复杂一点,但也不算特别复杂,需要用到 queue 来辅助,由于是层序遍历,每层的节点都按顺序加入 queue 中,而每当从 queue 中取出一个元素时,将其 next 指针指向 queue 中下一个节点即可,对于每层的开头元素开始遍历之前,先统计一下该层的总个数,用个 for 循环,这样当 for 循环结束的时候,该层就已经被遍历完了,参见代码如下:
解法二:
// Non-recursion, more than constant spaceclass Solution {public:Node* connect(Node* root) {if (!root) return NULL; queueq; q.push(root); while (!q.empty()) {int size = q.size(); for (int i = 0; i < size; ++i) {Node *t = q.front(); q.pop(); if (i < size - 1) {t->next = q.front(); }if (t->left) q.push(t->left); if (t->right) q.push(t->right); }}return root; }};
我们再来看下面这种碉堡了的方法,用两个指针 start 和 cur,其中 start 标记每一层的起始节点,cur 用来遍历该层的节点,设计思路之巧妙,不得不服啊:
解法三:
// Non-recursion, constant spaceclass Solution {public:Node* connect(Node* root) {if (!root) return NULL; Node *start = root, *cur = NULL; while (start->left) {cur = start; while (cur) {cur->left->next = cur->right; if (cur->next) cur->right->next = cur->next->left; cur = cur->next; }start = start->left; }return root; }};
Github 同步地址:
https://github.com/grandyang/leetcode/issues/116
类似题目:
Populating Next Right Pointers in Each Node II
Binary Tree Right Side View
参考资料:
https://leetcode.com/problems/populating-next-right-pointers-in-each-node/
https://leetcode.com/problems/populating-next-right-pointers-in-each-node/discuss/37473/My-recursive-solution(Java)
https://leetcode.com/problems/populating-next-right-pointers-in-each-node/discuss/37472/A-simple-accepted-solution
到此这篇关于C++实现LeetCode(116.每个节点的右向指针)的文章就介绍到这了,更多相关C++实现每个节点的右向指针内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
推荐阅读
- 关于QueryWrapper|关于QueryWrapper,实现MybatisPlus多表关联查询方式
- MybatisPlus使用queryWrapper如何实现复杂查询
- python学习之|python学习之 实现QQ自动发送消息
- 孩子不是实现父母欲望的工具——林哈夫
- opencv|opencv C++模板匹配的简单实现
- Node.js中readline模块实现终端输入
- 【Leetcode/Python】001-Two|【Leetcode/Python】001-Two Sum
- java中如何实现重建二叉树
- leetcode|leetcode 92. 反转链表 II
- 人脸识别|【人脸识别系列】| 实现自动化妆