117. 填充每个节点的下一个右侧节点指针 II
Q:
给定一个二叉树
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。
示例:
输入:{“KaTeX parse error: Expected '}', got 'EOF' at end of input: …":"1","left":{"id”:“2”,“left”:{“KaTeX parse error: Expected 'EOF', got '}' at position 53: …t":null,"val":4}̲,"next":null,"r…id”:“4”,“left”:null,“next”:null,“right”:null,“val”:5},“val”:2},“next”:null,“right”:{“KaTeX parse error: Expected '}', got 'EOF' at end of input: …null,"right":{"id”:“6”,“left”:null,“next”:null,“right”:null,“val”:7},“val”:3},“val”:1}
输出:{“KaTeX parse error: Expected '}', got 'EOF' at end of input: …":"1","left":{"id”:“2”,“left”:{“KaTeX parse error: Expected '}', got 'EOF' at end of input: …:null,"next":{"id”:“4”,“left”:null,“next”:{“KaTeX parse error: Expected 'EOF', got '}' at position 53: …t":null,"val":7}̲,"right":null,"…id”:“6”,“left”:null,“next”:null,“right”:{“KaTeX parse error: Expected 'EOF', got '}' at position 9: ref":"5"}̲,"val":3},"righ…ref”:“4”},“val”:2},“next”:null,“right”:{"$ref":“6”},“val”:1}
解释:给定二叉树如图 A 所示,你的函数应该填充它的每个 next 指针,以指向其下一个右侧节点,如图 B 所示。
提示:
你只能使用常量级额外空间。
使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
A:
我的想法就是bfs,然而题目要求常数空间。评论区大佬的思路是很巧妙的,本题和116不同的地方只有不是完美二叉树,故对于某节点,不能直接将其左右子树连接起来。这里我们申请一个dummy节点,在遍历某一层时,将下一层的所有节点从左到右串在dummy后面。当遍历完该层后,下一层的起始节点就是dummy->next,不得不说大佬思路就是强。
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;
    Node() {}
    Node(int _val, Node* _left, Node* _right, Node* _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
};
*/
class Solution {
public:
	Node* connect(Node* root)
	{
		Node* dummy = new Node();
		dummy->next = root;
		Node* cur = root, * tail = dummy;
		while (tail->next)
		{
			cur = tail->next;
            tail->next=0;
			while (cur)
			{
				if (cur->left)
				{
					tail->next = cur->left;
					tail = tail->next;
				}
				if (cur->right)
				{
					tail->next = cur->right;
					tail = tail->next;
				}
				cur = cur->next;
			}
			tail = dummy;
		}
		return root;
	}
};
117. 填充每个节点的下一个右侧节点指针 II的更多相关文章
- Java实现 LeetCode 117 填充每个节点的下一个右侧节点指针 II(二)
		117. 填充每个节点的下一个右侧节点指针 II 给定一个二叉树 struct Node { int val; Node *left; Node *right; Node *next; } 填充它的每 ... 
- [LeetCode] 116. 填充每个节点的下一个右侧节点指针
		题目链接 : https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node/ 题目描述: 给定一个完美二叉树 ... 
- [leetcode-117]填充每个节点的下一个右侧节点指针 II
		(1 AC) 填充每个节点的下一个右侧节点指针 I是完美二叉树.这个是任意二叉树 给定一个二叉树 struct Node { int val; Node *left; Node *right; Nod ... 
- Java实现 LeetCode 116 填充每个节点的下一个右侧节点指针
		116. 填充每个节点的下一个右侧节点指针 给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点.二叉树定义如下: struct Node { int val; Node *left ... 
- LeetCode OJ:Populating Next Right Pointers in Each Node II(指出每一个节点的下一个右侧节点II)
		Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tre ... 
- leetcode 117. 填充每个节点的下一个右侧节点指针 II(二叉树,DFS)
		题目链接 https://leetcode-cn.com/problems/populating-next-right-pointers-in-each-node-ii/ 题目大意 给定一个二叉树 s ... 
- leetcode117. 填充每个节点的下一个右侧节点指针 II
		给定一个二叉树struct Node { int val; Node *left; Node *right; Node *next;}填充它的每个 next 指针,让这个指针指向其下一个右侧节 ... 
- 【LeetCode】116. 填充每个节点的下一个右侧节点指针 Populating Next Right Pointers in Each Node 解题报告(Python)
		作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ... 
- 117.填充每个节点的下一个右侧节点指针II
		# Definition for a Node.class Node: def __init__(self, val: int = 0, left: 'Node' = None, right: 'No ... 
随机推荐
- ubuntu 报错 Unable to locate package
			解决方案参考 https://blog.csdn.net/u010622613/article/details/83017163 
- ASP.NET 模型验证2--验证部分属性
			在开发MVC时,模型验证非常常见,平常我们用的应该都是全验证 if(ModelState.IsValid){ //验证成功要做的事 .....} 但是有时候我们需要部分验证,比如修改用户信息时,因为更 ... 
- jdk8-》joining、groupingBy、summarizingInt函数
			拼接函数 Collectors.joining // 3种重载方法 Collectors.joining() Collectors.joining("拼接符") Collector ... 
- C++-CodeForces-1313A
			真的打起比赛来,连个贪心都写不好,呜呜呜. #include <bits/stdc++.h> using namespace std; ],t,ans; void IF(int&a ... 
- Cadence Allegro小技巧之指定Gerber生成路径
			Allegro生成Gerber数据时,默认会保存在与pcb文件相同目录路径下,Gerber数据本身就会生成好几个文件,然后与pcb文件,log文件,临时文件等混杂在一起,不易整理打包Gerber数据, ... 
- Laravel中如何做数据库迁移
			总的来说,做一次独立数据库迁移只需要三步,分别是创建迁移文件.修改迁移文件.运行迁移 1.创建数据库迁移文件php artisan make:migration create_articles_tab ... 
- asp.net + MVC5 入门完整教程一
			原文链接:https://blog.csdn.net/qq_21419015/article/details/80311918原创凌霜残雪 最后发布于2018-05-14 17:26:30 阅读数 3 ... 
- 来了,就给自己立个flag
			2019-09-16,刚刚申请的博客园. 不知道不觉,自己已经大四毕业了. 说来惭愧,已经接触IT这方面已经四年了. 但仍然感觉自己像个萌新,啥也不懂,这也不会,那也不会. 8月开始在公司大佬的指导下 ... 
- MySQL学习(六)change-buffer
			文章部分总结描述来自参考文章,属于半原创. 概述 文章将会介绍 change buffer 相关的知识点 查看 MySQL InnoDB 状态的命令 SHOW ENGINE INNODB ST ... 
- 素问 - IC跨期套利
			摘自<小韭的学习圈> Q 我现在是长持ic.我观察到IC1907和IC1909的贴水差会有波动.有时候,IC 1907涨的多,有时候IC1909涨的多.而在某一天这个趋势相对是稳定的. 那 ... 
