leetcode117 填充每個節點的下一個右側節點指針2

LeetCode 116 和 117 都是關于填充二叉樹節點的?next?指針的問題,但它們的區別在于?樹的類型?不同,117與 116 題類似,但給定的樹是?普通二叉樹(不一定完全填充),即某些節點可能缺少左或右子節點。

  • 樹的結構?不保證是完美的,可能缺失某些子節點。

  • 因此,116 題的簡單遞歸方法?不能直接適用,需要更通用的解法(如?BFS + 鏈表連接?或?逐層處理)。

  • 需要額外處理?子節點缺失?的情況,導致代碼比 116 題復雜。

116 題的?BFS(層級遍歷)?解法可以直接用于 117 題,因為 BFS 不依賴于樹的完美結構,而是?逐層遍歷所有節點,因此適用于?任意二叉樹(包括普通二叉樹和完美二叉樹)。

/*
// Definition for a Node.
class Node {
public:int val;Node* left;Node* right;Node* next;Node() : val(0), left(NULL), right(NULL), next(NULL) {}Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}Node(int _val, Node* _left, Node* _right, Node* _next): val(_val), left(_left), right(_right), next(_next) {}
};
*/class Solution {
public:Node* connect(Node* root) {queue<Node*> q;if(root == NULL) return root;Node* node;Node* prenode;q.push(root);while(!q.empty()){int size = q.size();for(int i = 0; i < size; i++){if(i == 0){prenode = q.front();q.pop();node = prenode;}else{node = q.front();q.pop();prenode->next = node;prenode = prenode->next;}if (node->left) q.push(node->left);if (node->right) q.push(node->right);}node->next = NULL;}return root;}
};

遞歸:

116 題的遞歸解法利用了?完美二叉樹的對稱性

117 題的樹可能?缺少左或右子節點,比如:

  • root.left?存在,但?root.right?不存在,此時?root.left.next?不能直接指向?root.right(因為?root.right?是?None)。

  • root.next?的子節點可能不存在,導致?root.right.next = root.next.left?失效。

117 題的遞歸解法(適用于普通二叉樹)

由于樹的結構不確定,我們需要:

  1. 找到當前節點的?next?節點的第一個有效子節點(可能是?next.left?或?next.right)。

  2. 遞歸處理右子樹,再處理左子樹(因為?next?鏈是從左到右建立的,必須先確保右側的?next?關系已經建立)。

class Solution {
public:Node* connect(Node* root) {if (!root) return nullptr;Node* curr = root;    // 當前層的頭節點Node dummy(0);        // 虛擬頭節點,用于連接下一層Node* prev = &dummy;  // 用于遍歷下一層while (curr) {// 遍歷當前層,連接下一層if (curr->left) {prev->next = curr->left;prev = prev->next;}if (curr->right) {prev->next = curr->right;prev = prev->next;}curr = curr->next; // 移動到當前層的下一個節點// 如果當前層遍歷完畢,進入下一層if (!curr) {curr = dummy.next;dummy.next = nullptr;prev = &dummy;}}return root;}
};

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/75557.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/75557.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/75557.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

軟考系統架構師 — 4 嵌入式軟件

目錄 4.1 考點分析 4.2 嵌入式微處理器 4.2.1嵌入式微處理器體系結構 5.2.2 嵌入式微處理器分類 4.2.3 多核處理器 4.3 嵌入式軟件 4.4 嵌入式系統 4.4.1 嵌入式系統的組成 4.4.2 嵌入式系統分類 4.4.3 嵌入式數據庫系統DBMS 4.4.4 嵌入式操作系統OS 4.4.5 嵌入式實…

RocketMQ 中的 ProducerManager 組件剖析

一、引言 在分布式系統的消息傳遞領域&#xff0c;RocketMQ 以其高性能、高可用性和強大的擴展性脫穎而出。ProducerManager 作為 RocketMQ 中的一個關鍵組件&#xff0c;在消息生產環節發揮著至關重要的作用。它負責管理消息生產者&#xff08;Producer&#xff09;的生命周期…

k8s進階之路:本地集群環境搭建

概述 文章將帶領大家搭建一個 master 節點&#xff0c;兩個 node 節點的 k8s 集群&#xff0c;容器基于 docker&#xff0c;k8s 版本 v1.32。 一、系統安裝 安裝之前請大家使用虛擬機將 ubuntu24.04 系統安裝完畢&#xff0c;我是基于 mac m1 的系統進行安裝的&#xff0c;所…

深度學習數據集劃分比例多少合適

在機器學習和深度學習中&#xff0c;測試集的劃分比例需要根據數據量、任務類型和領域需求靈活調整。 1. 常規劃分比例 通用場景 訓練集 : 驗證集 : 測試集 60% : 20% : 20% 適用于大多數中等規模數據集&#xff08;如數萬到數十萬樣本&#xff09;&#xff0c;平衡了訓練數…

【TS學習】(15)分布式條件特性

在 TypeScript 中&#xff0c;分布式條件類型&#xff08;Distributive Conditional Types&#xff09; 是一種特殊的行為&#xff0c;發生在條件類型作用于裸類型參數&#xff08;Naked Type Parameter&#xff09; 時。這種特性使得條件類型可以“分布”到聯合類型的每個成員…

NSSCTF [HGAME 2023 week1]simple_shellcode

3488.[HGAME 2023 week1]simple_shellcode 手寫read函數shellcode和orw [HGAME 2023 week1]simple_shellcode (1) motalymotaly-VMware-Virtual-Platform:~/桌面$ file vuln vuln: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpret…

PostgreSQL的擴展(extensions)-常用的擴展-pg_dirtyread

PostgreSQL的擴展&#xff08;extensions&#xff09;-常用的擴展-pg_dirtyread pg_dirtyread 是 PostgreSQL 的一個特殊擴展&#xff0c;它允許讀取已被刪除但尚未被 VACUUM 清理的數據行&#xff0c;是數據恢復的重要工具。 原理&#xff1a; pg_dirtyread 通過直接訪問表的…

linux3 mkdir rmdir rm cp touch ls -d /*/

Linux 系統的初始目錄結構遵循 FHS&#xff08;Filesystem Hierarchy Standard&#xff0c;文件系統層次標準&#xff09;&#xff0c;定義了每個目錄的核心功能和存儲內容。以下是 Linux 系統初始安裝后的主要目錄及其作用&#xff1a; 1. 核心系統目錄 目錄用途典型內容示例…

Bazel中的Symbol, Rule, Macro, Target, Provider, Aspect 等概念

學習Bazel &#xff0c;就要學習Bazel 的規則定義&#xff0c; 弄清各個概念是重要的一個步驟。 在 Bazel 規則定義中&#xff0c;Symbol、Rule 和 Macro 是常見的概念。除此之外&#xff0c;Bazel 還有 Target、Provider、Aspect Repository、Package、 Workspace、 Configura…

深入探究 Hive 中的 MAP 類型:特點、創建與應用

摘要 在大數據處理領域,Hive 作為一個基于 Hadoop 的數據倉庫基礎設施,提供了方便的數據存儲和分析功能。Hive 中的 MAP 類型是一種強大的數據類型,它允許用戶以鍵值對的形式存儲和操作數據。本文將深入探討 Hive 中 MAP 類型的特點,詳細介紹如何創建含有 MAP 類型字段的表…

基于Java的區域化智慧養老系統(源碼+lw+部署文檔+講解),源碼可白嫖!

摘 要 時代在飛速進步&#xff0c;每個行業都在努力發展現在先進技術&#xff0c;通過這些先進的技術來提高自己的水平和優勢&#xff0c;區域化智慧養老系統當然不能排除在外。區域化智慧養老系統是在實際應用和軟件工程的開發原理之上&#xff0c;運用Java語言、JSP技術以及…

關于JVM和OS中的指令重排以及JIT優化

關于JVM和OS中的指令重排以及JIT優化 前言&#xff1a; 這東西應該很重要才對&#xff0c;可是大多數博客都是以訛傳訛&#xff0c;全是錯誤&#xff0c;尤其是JVM會對字節碼進行重排都出來了&#xff0c;明明自己測一測就出來的東西&#xff0c;寫出來誤人子弟… 研究了兩天&…

VS2022遠程調試Linux程序

一、 1、VS2022安裝參考 VS Studio2022安裝教程&#xff08;保姆級教程&#xff09;_visual studio 2022-CSDN博客 注意&#xff1a;勾選的時候&#xff0c;要勾選下方的選項&#xff0c;才能調試Linux環境下運行的程序&#xff01; 2、VS2022遠程調試Linux程序測試 原文參…

WPF設計學習記錄滴滴滴4

<Button x:Name"btn"Content"退出"Width" 100"Height"25"Click"btn_Click" IsDefault"True"/> <Button x:Name"btn" <!-- 控件標識&#xff1a;定義按鈕的實例名稱為"btn&…

JVM 有哪些垃圾回收器

垃圾收集算法 標記-復制算法(Copying): 將可用內存按容量劃分為兩個區域,每次只使用其中的一塊。當這一塊的內存用完了,就將還存活著的對象復制到另外一塊上面, 然后再把已使用過的內存空間一次清理掉。 標記-清除算法(Mark-Sweep): 算法分為“標記” 和“清除”兩個…

React DndKit 實現類似slack 類別、頻道拖動調整位置功能

一周調試終于實現了類 slack 類別、頻道拖動調整位置功能。 歷經四個版本迭代。 實現了類似slack 類別、頻道拖動調整功能 從vue->react &#xff1b;更喜歡React的生態及編程風格&#xff0c;新項目用React來重構了。 1.zustand全局狀態 2.DndKit 拖動 功能視頻&…

新浪財經股票每天10點自動爬取

老規矩還是先分好三步&#xff0c;獲取數據&#xff0c;解析數據&#xff0c;存儲數據 因為股票是實時的&#xff0c;所以要加個cookie值&#xff0c;最好分線程或者爬取數據時等待爬取&#xff0c;不然會封ip 廢話不多數&#xff0c;直接上代碼 import matplotlib import r…

使用Android 原生LocationManager獲取經緯度

一、常用方案 1、使用LocationManager GPS和網絡定位 缺點&#xff1a;個別設備,室內或者地下停車場獲取不到gps定位,故需要和網絡定位相結合使用 2、使用Google Play服務 這種方案需要Android手機中有安裝谷歌服務,然后導入谷歌的第三方庫&#xff1a; 例如&#xff1a;i…

驗證碼實現

驗證碼案例 學了Spring MVC &#xff0c;配置 相關章節&#xff0c; 現可以嘗試寫一個前后端交互的驗證碼 文章目錄 驗證碼案例前言一、驗證碼是什么&#xff1f;二、需求1.引入依賴2.導入前端頁面3.約定前后段交互接口 三、代碼解析Controllermodelapplication.xml 四丶結果五…