Populating Next Right Pointers in Each Node II 任意(非完美)二叉树添加next指针 @LeetCode

每天一道LeetCode-----为二叉树增加next节点,指向同一层的下一个节点 Populating Next Right Pointers in Each Node 原题链接Populating Next Right Pointers in Each Node 将完全二叉树每个节点的next指针赋值,每个节点的next指针指向同一层的下一个节点,要求空间复杂度是O(1) 其实如果没有空间复杂度的要求,可以使用层次遍历,一种是使用队列,为了控制层次可以在每层的节点后 阅读详情

http://blog.youkuaiyun.com/fightforyourdream/article/details/14514165

在上题基础上扩展,此时数不是完美二叉树,而是任意二叉树

这道题有些tricky,有时间回头再研究一下


package Level4;

import Utility.TreeLinkNode;

/**
 * Populating Next Right Pointers in Each Node II 
 * 
 *  Follow up for problem "Populating Next Right Pointers in Each Node".

What if the given tree could be any binary tree? Would your previous solution still work?

Note:

You may only use constant extra space.
For example,
Given the following binary tree,
         1
       /  \
      2    3
     / \    \
    4   5    7
After calling your function, the tree should look like:
         1 -> NULL
       /  \
      2 -> 3 -> NULL
     / \    \
    4-> 5 -> 7 -> NULL
Discuss


 *
 */
public class S117 {

	public static void main(String[] args) {

	}

	public static void connect(TreeLinkNode root) {
		// 空节点就直接返回
		if (root == null){
			return;
		}
		
		// 找到与root同一行的next node
		TreeLinkNode rootNext = root.next;
		TreeLinkNode next = null;		// 下一个被连接的对象
		
		// rootNext如果是null说明已经处理完这一层的所有node
		// next不等于null说明找到了找到最左边的下一个被连接的对象
		while (rootNext != null && next == null)
		{
			if (rootNext.left != null){	// 优先找左边
				next = rootNext.left;
			} else{
				next = rootNext.right;
			}
			rootNext = rootNext.next;
		}
 
		if (root.left != null)
		{
			if (root.right != null){	//	内部相连
				root.left.next = root.right;
			}else{						// 跨树相连
				root.left.next = next;
			}
		}
		if (root.right != null){		// 跨树相连
			root.right.next = next;
		}
		
		connect(root.right);		// 要先让右边都先连起来
		connect(root.left);
    }
}


第二次做修改了一个地方的bug(在找rootnext时增加了break,及时退出),居然提交两次就通过了。

果然做LeetCode的真谛在于:遇到不懂 => 查答案 => 自己理解写出来或背下来 => 过一段时间后第二遍重做

比如这道题,我印象最深刻的是一定要先处理右子树再处理左子树,知道这点就足够写出来了。

关键就是找到next节点是在哪里,而这又要求找到rootnext节点在哪里。那个while循环就是破题的关键。


/**
 * Definition for binary tree with next pointer.
 * public class TreeLinkNode {
 *     int val;
 *     TreeLinkNode left, right, next;
 *     TreeLinkNode(int x) { val = x; }
 * }
 */
public class Solution {
    public void connect(TreeLinkNode root) {
        if(root == null){
            return;
        }
        
        TreeLinkNode rootnext = root.next;
        TreeLinkNode next = null;
        while(rootnext != null){
            if(rootnext.left != null){
                next = rootnext.left;
                break;
            }else if(rootnext.right != null){
                next = rootnext.right;
                break;
            }else{
                rootnext = rootnext.next;
            }
        }
        
        if(root.right != null){
            root.right.next = next;
        }
        if(root.left != null){
            if(root.right != null){
                root.left.next = root.right;
            }else{
                root.left.next = next;
            }
        }
        
        connect(root.right);
        connect(root.left);
    }
}





给二叉树加上右侧指针(二叉树) 算法特点及适用场景该算法利用层次遍历的方式,通过队列辅助实现了对二叉树同层节点的连接,简单直接。适用于需要对二叉树同层节点进行处理或连接的场景,比如在一些图形处理中,将二叉树结构转换为层次结构更方便处理,或者在某些算法中需要按照层次顺序访问二叉树节点并进行相关操作时可以使用。注意事项及可能遇到的问题在实现代码时,要注意队列的正确使用,包括入队、出队操作以及判断队列是否为空等。同时,要正确处理节点next指针的连接,避免出现错误的连接情况。 阅读详情

相关推荐

二叉树系列---标记二叉树中每个节点的next指针

题目Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; }Populate each next pointer to point to its next right node. If t

bh_xiaoxinba的博客 2045

leetcode---给定一个完美二叉树,填充所有节点的next指针,指向它右兄弟节点。如果没有右兄弟节点,则应该将next指针设置为NULL。 初始时,所有的next指针都为NULL

题目描述 给定一个二叉树 struct TreeLinkNode {↵ TreeLinkNode *left;↵ TreeLinkNode *right;↵ TreeLinkNode *next;↵ } 填充所有节点的next指针,指向它右兄弟节点。如果没有右兄弟节点,则应该将next指针设置为NULL。 初始时,所有的next指针都为NULL 注意: 你只能使用常量级的额外内存空间 可以假设给出的二叉树是一个完美的二叉树(即,所有叶子节点都位于同

sunnnnh的博客 748

关于使用CMT2300A FIFO缓存区间设置为64Byte的问题

帮助你解决在使用CMT2300A 时遇到的各种问题,若有需要,请及时与我交流

teleger的博客 1429

Populating Next Right Pointers in Each Node II

此题最naive的办法就是利用队列进行BFS,同一层的节点从左到右连接起来即可。但这样一来需要的额外空间至少是树的最大宽度。 下面的解法需要的额外空间是树的高度,相比于树的宽度,树的高度一般情况来说不会太大,为logN级别。基本思路是维护每一层的第一个尚未连接起来的节点,当该层的一下个节点到来时,将其与新的节点连接起来,并替换为新的节点。 /** * Definition for b

durong123123123的专栏 324

1.全基因组重测序数据分析介绍

二代测序原理及fastq数据解读、全基因组重测序数据分析内容

weixin_53682198的博客 1883

Xilinx IP核 Block Memory Generator v8.4 的使用

本文主要介绍如何使用并初始化 Xilinx 提供的IP核 Block Memory Generator v8.4`,为了确保成功初始化,还对其进行了一个简单的仿真,更多细节请参考官方手册。

高阶近似的博客 1万+

每日一题:填充二叉树节点的Next指针——从完美二叉树到任意二叉树

在二叉树中,每个节点除了有左子节点和右子节点外,还可以有一个 `next` 指针,指向同一层中右侧的节点。填充 `next` 指针是一个经典的算法问题,常见于面试和编程竞赛中。本文将详细探讨如何在不同类型的二叉树中填充 `next` 指针,并分析其时间复杂度和空间复杂度。

m0_59246703的博客 1182

基于 PCL 的工业盒体点云精准分割

本文提出一种基于PCL点云库的工业盒体点云分割算法,采用由粗到精的分层策略解决传统方法在噪声、稀疏和堆叠场景下的分割问题。算法通过区域生长粗分割、RANSAC平面筛选、球面回溯补全、凹包边界提取和圆柱回溯精分割五大核心模块,充分利用盒体几何先验特征,实现高效精准的分割效果。文章详细阐述了算法流程、参数调优指南及工程化要点,指出该方法相比深度学习具有速度快、鲁棒性强、部署简单的优势。同时分析了算法在倾斜、异形目标上的局限性,并展望了结合深度学习特征的混合模型发展方向。该算法为工业自动化场景中的3D视觉检测提供

weixin_45196569的博客 172

117. Populating Next Right Pointers in Each NodeII

题目描述(中等难度) 给定一个二叉树,然后每个节点有一个 next 指针,将它指向它右边的节点。和 116 题 基本一样,区别在于之前是满二叉树。 解法一 BFS 直接把 116 题 题的代码复制过来就好,一句也不用改。 利用一个栈将下一层的节点保存。通过pre指针把栈里的元素一个一个接起来。 public Node connect(Node root) { if (root == null) { return root; } Queue<Node> q

猫敷雪 396

主题033:燃烧反应工程

燃烧反应工程(Combustion Reaction Engineering)是研究燃料与氧化剂发生剧烈氧化反应的科学,涉及化学反应动力学、流体力学、传热传质等多个学科。燃烧是人类利用能源的主要方式,广泛应用于发电、交通运输、工业加热等领域。燃烧反应通常通过自由基链式反应进行。链引发:RH+O2⟶R⋅+HO2⋅ RH + O_2 \longrightarrow R^\cdot + HO_2^\cdot RH+O2​⟶R⋅+HO2⋅​链传递:R⋅+O2⟶RO2⋅ R^\cdot + O_2 \longrigh

kkchenjj的博客 231

Python爬虫博客:爬取碳排放交易数据——使用最新技术的完整实现

通过上述方法,我们可以构建一个高效的爬虫,爬取碳排放交易市场的数据并进行分析。这个项目不仅展示了如何处理静态和动态网页,还提供了如何存储数据、分析数据和可视化结果的技巧。随着爬虫技术的不断进步,我们可以进一步提升爬取效率和数据分析能力。如果你希望更深入了解如何进行数据挖掘和机器学习分析,可以尝试将碳排放数据与其他经济数据结合,利用机器学习模型进行趋势预测或决策支持。

2201_76125261的博客 352

Populating Next Right Pointers in Each Node II - LeetCode 117

题目描述: Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tree could be any binary tree? Would your previous solution still work? Note: You may only use consta

bu_min的博客 475

OpenOCD入门到精通:第 0 章 教程导读

摘要:本教程是OpenOCD嵌入式调试工具的完整指南,适合从新手到资深工程师的学习需求。内容涵盖基础配置、调试技巧、Flash编程、TCL脚本自动化、源码解析和二次开发,共8大部分30章。教程提供5种学习路线,可根据角色和目标灵活选择,配套资源包含示例代码和配置文件。通过系统学习,读者将掌握OpenOCD从使用到扩展的全套技能,成为嵌入式调试领域的专家。

从事嵌入式linux android驱动开发,拥有全栈能力 1941

leetcode Populating Next Right Pointers in Each Node II题解

题目描述: Given a binary tree struct Node { int val; Node *left; Node *right; Node *next; } Populate each next pointer to point to its next right node. If there is no next right node, the nex...

leo_weile的博客 253

SOME/IP协议详解「2.1.2·Payload数据类型序列化」

SOME/IP协议详解「2.1.2·Payload数据类型序列化」 点击返回雪云飞星的SOME/IP协议详解「总目录」 SOME/IP协议详解「2.1.2·Payload数据类型序列化」1 大小端问题2 数据对齐填充问题3 都有哪些数据类型 之前简单的概括了一下序列化/反序列化,就是降维打击,从这一章开始到2.1所有章节结束,都在讲解这个降维打击的详细规则与原理 1 大小端问题 首先什么是大小端: 大端:高字节存放到内存的低地址 小端:高字节存放到内存的高地址 假如有一个数据是0x12345678

雪云飞星的博客 4628

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

117. Populating Next Right Pointers in Each Node II(填充每个节点的下一个右侧节点指针 II)

题目链接: https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/ 思路: 整体思路还是和上一题一样,只不过这次的不是完全二叉树,所以需要保存当前层的头结点。 而且在同一层中还要保存当前节点的上一个节点,便于横向连接。 Example: AC 0ms 100% java: /* ...

God_Mood的博客 257

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【LeetCode 面试经典150题】Populating Next Right Pointers in Each Node II 填充每个节点的右侧节点的指针II

Populate each pointer to point to its next right node. If there is no next right node, the pointer should be set to NULL.Initially, all pointers are set to NULL.填充每个节点的 指针,使其指向其右侧的下一个节点。如果没有右侧的下一个节点,则将 指针设置为 NULL。初始时,所有 指针都设置为 NULL。输入: = [1,2,3,4,5,

qq_43513394的博客 453

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Populating Next Right Pointers in Each Node I, II

Populating Next Right Pointers in Each Node Given a binary tree struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } P

jialuyyy的博客 260

二叉树层序遍历到「Next 指针」:从 BFS 到 O(1) 空间

这篇文章以 LeetCode 117「Populating Next Right Pointers in Each Node II」为背景,从最基础的二叉树层序遍历讲起,一步步推到如何在常数额外空间下,把每一层的节点用 next 指针串起来。题目大意:给定一棵任意形状的二叉树,每个节点有 left、right 和 next 三个指针,要求把每一层上的节点从左到右用 next 串成链表;如果某个节点右边没有其它节点,则它的 next 为 NULL。

六六哥的博客 698

leetcode populating-next-right-pointers-in-each-node-ii(Java)

leetcode题目 populating-next-right-pointers-in-each-node-ii -- newcoder 34 填充每个节点的下一个右侧节点指针II -- leetcode 117 题目描述 Follow up for problem "Populating Next Right Pointers in Each Node". What if t...

聚沙成塔 395

tree:二叉树next指针

Leetcode, PopulatingNextRightPointersInEachNode #include <iostream> #include <vector> #include <stack> #include <algorithm> using namespace std; struct TreeNode { int _val; TreeNode *_left, *_right, *_next; TreeNode(int x) : _va

qq_36333986的博客 253

之字遍历二叉树并填充next指针

//蚂蚁一面 评测题目: 给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点, //填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。 //初始状态下,所有next 指针都被设置为 NULL。 public class Test { public static void main(String[] args) { // pointToNext(root); } publi...

Juwenzhe_HEBUT的博客 845

【LeetCode】117. Populating Next Right Pointers in Each Node II 解题报告(Python)

【LeetCode】117. Populating Next Right Pointers in Each Node II 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/description/ 题目描述: Fol...

负雪明烛 2654

117. Populating Next Right Pointers in Each Node II Leetcode Python

Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tree could be any binary tree? Would your previous solution still work? Note: You may only use con

hyperbolechi的专栏 1182

算法学习(七)--二叉树左右相邻结点添加next指针

问题: 给定一个二叉树 struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; } 填充所有节点的next指针,指向最接近它的同一层右边节点。如果没有同一层没有右边的节点,则应该将next指针设置为NULL。 初始时,所有的next指针都为NULL 注意: 你只能使用常量级的额外内存空间 可以假设给出的二叉树是一个完美的

qq_36676123的博客 906

[leetcode] 117. Populating Next Right Pointers in Each Node II 解题报告

题目链接:https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/ Follow up for problem "Populating Next Right Pointers in Each Node". What if the given tree could be any bina

小榕流光的专栏 1968
上一篇: Binary Tree Level Order Traversal II 二叉树按层遍历(反向输出)@LeetCode
下一篇: Insertion Sort List 链表插入排序@LeetCode
chiiis
博客等级 码龄14年 422粉丝 429原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值