【算法--鏈表】117.填充每個節點的下一個右側節點指針Ⅱ--通俗講解

通俗算法講解推薦閱讀:
【算法–鏈表】83.刪除排序鏈表中的重復元素–通俗講解
【算法–鏈表】刪除排序鏈表中的重復元素 II–通俗講解
【算法–鏈表】86.分割鏈表–通俗講解
【算法】92.翻轉鏈表Ⅱ–通俗講解
【算法–鏈表】109.有序鏈表轉換二叉搜索樹–通俗講解
【算法–鏈表】114.二叉樹展開為鏈表–通俗講解
【算法–鏈表】116.填充每個節點的下一個右側節點指針–通俗講解


通俗易懂講解“填充每個節點的下一個右側節點指針Ⅱ”算法題目

一、題目是啥?一句話說清

給定一個二叉樹,填充每個節點的next指針,使其指向同一層的下一個右側節點;如果找不到下一個節點,則next指針為NULL。初始時所有next指針都是NULL。

示例:

  • 輸入:二叉樹(可能不完整,即不是滿二叉樹)
  • 輸出:二叉樹 with next pointers filled

二、解題核心

使用層次遍歷,但不需要使用隊列,而是利用已建立的next指針來遍歷下一層。我們使用一個虛擬節點(dummy)來幫助構建下一層的鏈表,然后用當前層的next指針來訪問所有節點,同時連接下一層的節點。

這就像在每一層中,我們有一個鏈表,我們遍歷這個鏈表來處理每個節點,同時將它們的子節點連接到下一層的鏈表中,從而節省空間。

三、關鍵在哪里?(3個核心點)

想理解并解決這道題,必須抓住以下三個關鍵點:

1. 利用當前層的next指針遍歷

  • 是什么:從根節點開始,當前層已經通過next指針連接起來,所以我們可以像遍歷鏈表一樣遍歷當前層。
  • 為什么重要:這樣可以避免使用隊列,節省空間。我們不需要存儲所有節點,只需要幾個指針。

2. 構建下一層的鏈表

  • 是什么:在處理當前層的每個節點時,我們將它的左子節點和右子節點依次添加到下一層的鏈表中。使用一個tail指針來維護下一層鏈表的尾部。
  • 為什么重要:這樣我們可以按順序連接下一層的節點,為下一層的遍歷做準備,并保持節點的順序。

3. 虛擬節點(Dummy Node)的運用

  • 是什么:為下一層創建一個虛擬頭節點,這樣我們可以輕松地訪問下一層的頭節點。
  • 為什么重要:虛擬節點簡化了鏈表操作,避免了處理空鏈表的情況。當下一層沒有節點時,虛擬節點的next為NULL,我們可以停止循環。

四、看圖理解流程(通俗理解版本)

假設我們有這樣一個二叉樹:

        1/ \2   3/ \   \4   5   7

我們需要填充next指針。

  1. 初始化:從根節點開始,當前current指向節點1。
  2. 第一層處理
    • 創建虛擬節點dummytail指向dummy
    • 遍歷當前層(只有節點1):
      • 節點1有左子節點2:將tail.next指向節點2,tail移動到節點2。
      • 節點1有右子節點3:將tail.next指向節點3,tail移動到節點3。
    • 當前層遍歷完后,current設置為dummy.next(即節點2)。
  3. 第二層處理
    • 當前current指向節點2(第二層的頭)。
    • 創建新的虛擬節點dummytail指向dummy
    • 遍歷當前層(節點2和節點3通過next連接):
      • 節點2有左子節點4:tail.next指向節點4,tail移動到節點4。
      • 節點2有右子節點5:tail.next指向節點5,tail移動到節點5。
      • 節點3有右子節點7:tail.next指向節點7,tail移動到節點7。
    • 當前層遍歷完后,current設置為dummy.next(即節點4)。
  4. 第三層處理
    • 當前current指向節點4(第三層的頭)。
    • 創建虛擬節點dummytail指向dummy
    • 遍歷當前層(節點4、5、7通過next連接):
      • 節點4沒有子節點,跳過。
      • 節點5沒有子節點,跳過。
      • 節點7沒有子節點,跳過。
    • 下一層為空,循環結束。

最終next指針:

  • 節點1的next為NULL。
  • 節點2的next指向節點3。
  • 節點3的next為NULL。
  • 節點4的next指向節點5。
  • 節點5的next指向節點7。
  • 節點7的next為NULL。

五、C++ 代碼實現(附詳細注釋)

#include <iostream>
using namespace std;// 二叉樹節點定義
class Node {
public:

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

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

相關文章

分詞器(Tokenizer)總結(89)

分詞器(Tokenizer)總結 分詞器(Tokenizer) 分詞器的詞表(vocabulary)長度通常短于模型嵌入層(embedding layer)的長度。 結束標記(EOS token)應僅用于標記文本結尾,不可用于其他用途。 填充標記(PAD token)通常未預先定義,但你仍可能需要用到它: 對于生成式模型…

19 webUI應用中 Controlnet精講(05)-圖像修復與編輯

前面的篇章已經詳細講解了線條約束、三維關系與空間深度、人體姿態等幾類controlnet的功能與應用&#xff0c;本節內容將對通過controlnet對圖像修復與編輯進行講解。 通過controlnet也可以對圖片進行編輯、重繪及放大等操作&#xff0c;具體包括Recolor、Inpaint、Tile等&…

消息推送的三種常見方式:輪詢、SSE、WebSocket

摘要&#xff1a;本文介紹消息推送的三種常見方式&#xff1a;輪詢&#xff08;定時請求&#xff0c;易增負擔&#xff09;與長輪詢&#xff08;阻塞請求至有數據 / 超時&#xff0c;減少請求&#xff09;、SSE&#xff08;HTTP 單向實時傳輸&#xff0c;純文本、自動重連&…

論文閱讀:ACL 2024 Stealthy Attack on Large Language Model based Recommendation

總目錄 大模型相關研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 https://arxiv.org/pdf/2402.14836 https://www.doubao.com/chat/19815566713551106 文章目錄速覽攻擊方法速覽一、攻擊核心目標與前提1. 核心目標2. 攻擊前提二、模型無關的簡單…

自動駕駛中的傳感器技術43——Radar(4)

本文對目前毫米波雷達中的天線設計進行比較全面的羅列&#xff0c;并進行簡單的設計評述 1、實際設計案例 圖1 涵蓋能寬窄覆蓋的天線設計&#xff08;無俯仰分辨率&#xff09;圖2 Bosch前雷達的天線設計&#xff08;有俯仰的分辨率但比較弱&#xff0c;也涵蓋了擴展覆蓋&…

使用反轉法線材質球,實現切換天空盒相同的功能,優點:包體變小

切換天空盒第一步先把SKY 天空球資源導入到工程里&#xff0c; 第二步&#xff1a;天空球文件下的SKY預制件拖入到場景里 第三步 選著SKY材質球&#xff0c;拖入自己的全景圖片(圖片分辨率不能超過5000*5000&#xff0c;否則手機無法顯示) 如果并沒有效果&#xff0c;看看圖…

真正有效的數據指標體系應該長什么樣?

真正有效的數據指標體系應該長什么樣&#xff1f;為什么大多數企業的指標體系都是"花架子"&#xff1f;真正有效的指標體系應該長什么樣&#xff1f;從數據到洞察&#xff1a;讓指標真正"活"起來結語在這個人人都在談數字化轉型的時代&#xff0c;企業就像…

分布式專題——6 Redis緩存設計與性能優化

1 多級緩存架構2 緩存設計 2.1 緩存穿透 2.1.1 簡介緩存穿透是什么&#xff1f;當查詢一個根本不存在的數據時&#xff0c;緩存層和存儲層都不會命中。正常邏輯下&#xff0c;存儲層查不到數據就不會寫入緩存層。這會導致&#xff1a;每次請求這個不存在的數據&#xff0c;都要…

一文了解大模型壓縮與部署

一文了解大模型壓縮與部署&#xff1a;從 INT4 量化到 MoE&#xff0c;讓大模型跑在手機、邊緣設備和云端&#x1f3af; 為什么需要模型壓縮與部署&#xff1f;你訓練了一個強大的大模型&#xff08;如 Qwen-72B、LLaMA-3-70B&#xff09;&#xff0c;但在部署時發現&#xff1…

新手向:中文語言識別的進化之路

自然語言處理&#xff08;NLP&#xff09;技術正在以前所未有的速度改變我們與機器的交互方式。根據Gartner最新報告顯示&#xff0c;全球NLP市場規模預計在2025年將達到430億美元&#xff0c;年復合增長率高達21%。而中文作為世界上使用人數最多的語言&#xff08;全球約15億使…

LeetCode100-206反轉鏈表

本文基于各個大佬的文章上點關注下點贊&#xff0c;明天一定更燦爛&#xff01;前言Python基礎好像會了又好像沒會&#xff0c;所有我直接開始刷leetcode一邊抄樣例代碼一邊學習吧。本系列文章用來記錄學習中的思考&#xff0c;寫給自己看的&#xff0c;也歡迎大家在評論區指導…

uniapp開源多商戶小程序商城平臺源碼 支持二次開發+永久免費升級

在電商行業競爭日益激烈的今天&#xff0c;擁有一個功能強大、靈活可拓展的多商戶小程序商城至關重要。今天給大家分享一款 uniapp 開源多商戶小程序商城平臺源碼&#xff0c;它不僅具備豐富的基礎功能&#xff0c;還支持二次開發&#xff0c;更能享受永久免費升級服務&#xf…

使用腳本一鍵更新NTP服務器地址為自定義地址

【使用場景】 在銀河麒麟桌面操作系統V10SP1-2303版本中使用腳本一鍵修改NTP服務器地址為自定義地址。 【操作步驟】 步驟1. 編寫shell腳本 ```bash desktop2303@desktop2303-pc:~$ vim setntptimeserver.sh #!/bin/bashfunction modifykylinconf() { # 檢查是否已存在目標配置…

linux內核 - 內核架構概覽

當 Linux 系統啟動時,內核會在啟動過程的早期階段接管控制——緊跟在固件(BIOS 或 UEFI)和引導加載程序完成任務之后。此時,壓縮的 Linux 內核鏡像會被加載到內存中,通常會附帶一個稱為 initramfs 的最小臨時根文件系統,它用于在切換到真實根文件系統并繼續系統初始化之前…

[react] react-router-dom是啥?

頁面路由&#xff0c;注意頁面路由不是路由器&#xff0c;因為我之前總是把路由和路由器搞混。而且我總是把前端頁面的路由和路由器的路由搞混。那么這里一定要明白&#xff0c;這里我所說的頁面路由就是指在瀏覽器里面的導航路由。 npm create vitelatest my-react-app – --t…

HTTP簡易客戶端實現

&#x1f310; HTTP簡易客戶端實現 流程圖&#xff1a; 引用&#xff1a; chnroutes2.cpp#L474 chnroutes2_getiplist() chnroutes2.cpp#L443 http_easy_get(…) &#x1f552; 1. 超時管理機制 (http_easy_timeout) &#x1f539; 核心功能&#xff1a;創建定時器自動關…

建筑面LAS點云高度計算工具

效果 例如中位數,計算后,在shp建筑面中添加一個字段meidian_hei 準備數據 1、建筑矢量面.shp 2、點云.las 界面 腳本 import laspy import shapefile # pyshp庫,處理POLYGONZ坐標格式異常 import pandas as pd import numpy as np import os import traceback # 打印…

java day18

繼續學習&#xff0c;學習sringboot案例&#xff1b;熟悉的三件套&#xff1b;比如做一個表&#xff0c;前端搭建好框架&#xff0c;然后返回給后端一個請求&#xff0c;說要這個表的數據吧&#xff1b;然后通過請求和規定的格式返回給后端之后&#xff0c;我們后端進行接收處理…

并發編程原理與實戰(二十八)深入無鎖并發演進,AtomicInteger核心API詳解與典型場景舉例

無鎖并發演進背景 隨著系統高并發的壓力越來越大&#xff0c;傳統同步機制在高并發場景下的性能瓶頸和缺點可能會逐漸顯露&#xff1a; &#xff08;1&#xff09;性能損耗&#xff1a;synchronized等鎖機制會導致線程阻塞和上下文切換&#xff0c;在高并發場景下性能損耗顯著。…

整體設計 之 緒 思維導圖引擎 之 引 認知系統 之 引 認知系統 之 序 認知元架構 之5 : Class 的uml profile(豆包助手 之7)

摘要&#xff08;AI生成&#xff09;三層中間件架構的約束邏輯體系1. 架構定位與功能分工三個中間層&#xff08;隔離層/隱藏層/防腐層&#xff09;構成數據處理管道&#xff0c;分別承擔&#xff1a;隔離層&#xff1a;跨系統數據轉換處理對象&#xff1a;異構數據&#xff08…