【leetcode】【圖解】617. 合并二叉樹

題目

難度:簡單

給你兩棵二叉樹: root1root2

想象一下,當你將其中一棵覆蓋到另一棵之上時,兩棵樹上的一些節點將會重疊(而另一些不會)。你需要將這兩棵樹合并成一棵新二叉樹。合并的規則是:如果兩個節點重疊,那么將這兩個節點的值相加作為合并后節點的新值;否則,不為 null 的節點將直接作為新二叉樹的節點。

返回合并后的二叉樹。

注意: 合并過程必須從兩個樹的根節點開始。
在這里插入圖片描述

思路

  1. 本題可以通過常見的二叉樹的遍歷方式(同時也是遞歸的方式),同時遍歷兩棵樹,每次遍歷獲取相同的節點,然后根據以下三種情況求和
    1. 若遍歷到的位置均不為空,則對兩個節點求和,將求和的結果覆蓋 root2 的這個節點
    2. 若遍歷到的位置,root1 為空,則返回 root2 的值(root2 為空也返回)
    3. 若遍歷到的位置,root2 為空,則返回 root1 的值(root1 為空也返回)
  2. 對代碼的圖解見代碼實現部分

代碼實現

本代碼采用前序遍歷的方式來遍歷兩棵二叉樹

    TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) {if (root1 == nullptr) {return root2;}if (root2 == nullptr) {return root1;}root2->val = root2->val + root1->val;root2->left = mergeTrees(root1->left, root2->left);root2->right = mergeTrees(root1->right, root2->right);return root2;}

下面通過一個示意圖來演示遞歸的效果(左樹為 root1,右樹為 root2,右側方框表示函數棧)
在這里插入圖片描述
首先,root1 和 root2 入棧,此時它們分別指向的值是 1,2,按照求和的要求,符合情況 1,于是 root2 的值更新為 3。

此時代碼執行到了 root2->left = mergeTrees(root1->left, root2->left); 處,我們繼續將 root1,root2 的左節點傳入遞歸函數。
在這里插入圖片描述
如圖,我們看到出現了一個新的函數調用棧,此時的 root1 和 root2 為 3 和 1,它們分別是傳入的上一層函數中的 root1->left 和 root2->left 的值。

同理計算 root2->val = root2->val + root1->val; 得到 root2 的值為 4。

此時代碼執行到了 root2->left = mergeTrees(root1->left, root2->left); 處,我們繼續將 root1,root2 的左節點傳入遞歸函數。

在這里插入圖片描述
在該層遞歸的代碼中,因為 root2 為 null,所以觸發了以下這段代碼,于是此棧被銷毀,并返回上一層棧中。

        if (root2 == nullptr) {return root1;}

在這里插入圖片描述
此時左節點已經處理完了,接著處理右節點(即紅色節點的右節點),處理方式同上一步相同。

之后的步驟以此類推就可以完成。

時空復雜度分析

時間復雜度為為 O(n),n 為節點的個數,空間復雜度為 O(h),h 為樹的高度,因為每一層樹都要開辟一個新的棧空間

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

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

相關文章

Python web實戰之Django的AJAX支持詳解

關鍵詞:Web開發、Django、AJAX、前端交互、動態網頁 今天和大家分享Django的AJAX支持。AJAX可實現在網頁上動態加載內容、無刷新更新數據的需求。 1. AJAX簡介 AJAX(Asynchronous JavaScript and XML)是一種在網頁上實現異步通信的技術。通過…

electron 使用node C++插件 node-gyp

node C插件使用,在我們常規使用中,需要使用node-gyp指定對飲的node版本即可 在electron的使用中,我們需要指定的是electron版本要不然會報錯使用的v8內核版本不一致導致C擴展無法正常引入 electron官方文檔-node原生模塊 package.json {&quo…

標準的rust后端項目的結構是怎樣的呢?

一個標準的Rust后端項目通常遵循一種常見的項目結構,以下是一個示例: . ├── Cargo.toml ├── src │ ├── main.rs │ ├── lib.rs │ ├── handlers │ │ ├── mod.rs │ │ └── user_handler.rs │ ├── models │…

一百五十四、Kettle——Linux上安裝Kettle9.3(踩坑,親測有效,附截圖)

一、目的 由于kettle8.2在Linux上安裝后,共享資源庫創建遇到一系列問題,所以就換成kettle9.3 二、kettle版本以及安裝包網盤鏈接 kettle9.3.0安裝包網盤鏈接 鏈接:https://pan.baidu.com/s/1MS8QBhv9ukpqlVQKEMMHQA?pwddqm0 提取碼&…

解決電腦聲音正常但就是某些游戲沒聲音問題

電腦聲音正常,玩普遍游戲也正常,就有游戲不出聲音 詳細介紹經過,不喜歡的請直接跳 第三部分。 一、先說下起因現象。 1 大富翁11 沒聲音。 前段時間無聊懷舊就買了個大富翁11玩玩,近二十年前的老臺式機正常無問題。后來想在性能…

Java多線程編程:實現并發處理的高效利器

Java多線程編程:實現并發處理的高效利器 作者:Stevedash 發表于:2023年8月13日 20點45分 來源:Java 多線程編程 | 菜鳥教程 (runoob.com) ? 在計算機領域,多線程編程是一項重要的技術,可以使程序同時執…

InnoDB文件物理結構解析6 - FIL_PAGE_INDEX

本文討論Secondary Key Page的解析,也就是表非主鍵索引的記錄存儲。與Clustered Key Page有相同的基本記錄結構,也細分為Leaf Page和Non-Leaf Page,我們先看結構: ### Contents (Secondary Key - Leaf Page) ### ---------------…

從小白到大神之路之學習運維第79天-------Kubernetes網絡組件詳解

第四階段 時 間:2023年8月14日 參加人:全班人員 內 容: Kubernetes網絡組件詳解 目錄 一、Kubernetes網絡組件 (一)Flannel網絡組件 (二)Calico 網絡插件 (1)…

設計模式——建造者(Builder)模式

建造者模式(Builder Pattern),又叫生成器模式,是一種對象構建模式 它可以將復雜對象的建造過程抽象出來,使這個抽象過程的不同實現方法可以構造出不同表現的對象。建造者模式是一步一步創建一個復雜的對象,…

(14)嵌套列表,Xpath路徑表達式,XML增刪查改,Implicit,Operator,Xml序列化,淺拷貝與深拷貝

一、作業問題 1、問:listbox1.items[i]返回的object是指的字符串嗎? 答:items是真正的對象集合,在Add時加的是Person對象p,則里面的item就是Person對象p。 但是,在listbox1顯…

在單元測試中使用Jest模擬VS Code extension API

對VS Code extension進行單元測試時通常會遇到一個問題,代碼中所使用的VS Code編輯器的功能都依賴于vscode庫,但是我們在單元測試中并沒有添加對vscode庫的依賴,所以導致運行單元測試時出錯。由于vscode庫是作為第三方依賴被引入到我們的VS C…

[oneAPI] BERT

[oneAPI] BERT BERT訓練過程Masked Language Model(MLM)Next Sentence Prediction(NSP)微調 總結基于oneAPI代碼 比賽:https://marketing.csdn.net/p/f3e44fbfe46c465f4d9d6c23e38e0517 Intel DevCloud for oneAPI&…

JVM 中的編譯器

在Java的世界里,JVM(Java Virtual Machine)扮演了重要的角色。JVM是一個虛擬機,是Java程序的運行環境,它能夠將Java字節碼文件解釋執行,使得Java程序可以跨平臺。在JVM內部,有一個重要的組件就是編譯器,它的作用就是將Java源代碼編譯成字節碼,讓JVM可以識別并執行。 …

redis集群和分片-Redis Cluster:分布式環境中的數據分片、主從復制和 Sentinel 哨兵

當涉及到 Redis 中的集群、分片、主從復制和 Sentinel 哨兵時,這些是構建分布式 Redis 環境中非常重要的概念和組件。下面詳細介紹這些概念以及它們在分布式環境中的作用。 Redis Cluster Redis Cluster 是 Redis 官方提供的分布式解決方案,用于管理和…

React源碼解析18(4)------ completeWork的工作流程【mount】

摘要 經過上一章,我們得到的FilberNode已經具有了child和return屬性。一顆Filber樹的結構已經展現出來了。 那我們最終是想在頁面渲染真實的DOM。所以我們現在要在completeWork里,構建出一顆離屏的DOM樹。 之前在說FilberNode的屬性時,我們…

zabbix案例--zabbix監控Tomcat

目錄 一、 部署tomcat 二、配置zabbix-java-gateway 三、配置zabbix-server 四、配置zabbix-web界面 一、 部署tomcat tar xf apache-tomcat-8.5.16.tar.gz -C /usr/local/ ln -sv /usr/local/apache-tomcat-8.5.16/ /usr/local/tomcat cd /usr/local/tomcat/bin開啟JMX…

Vscode 常用操作教程

一、語言換成中文 這是我們可以直接點擊左邊欄第四個圖標搜索插件 chinese ,也可以直接ctrlshiftp快捷鍵也會出來如圖所示圖標,出來chinese 插件之后選擇安裝install,安裝完成之后重新ctrlshiftp會出現如圖所示頁面 找到我的鼠標在的地方對應的中文,此時…

win10下如何安裝ffmpeg

安裝ffmpeg之前先安裝win10 綠色軟件管理軟件:scoop. Scoop的基本介紹 Scoop是一款適用于Windows平臺的命令行軟件(包)管理工具,這里是Github介紹頁。簡單來說,就是可以通過命令行工具(PowerShell、CMD等…

VVIC-商品詳情

一、接口參數說明: item_get-根據ID取商品詳情,點擊更多API調試,請移步注冊API賬號點擊獲取測試key和secret 公共參數 請求地址: https://api-gw.onebound.cn/vvic/item_get 名稱類型必須描述keyString是調用key(點擊獲取測試k…

第一百一十三回 dart中的getter/setter方法

文章目錄 概念介紹使用方法示例代碼使用擴展 我們在上一章回中介紹了 flutter_screenutil包相關的內容,本章回中將介紹 dart中的setter/getter方法.閑話休提,讓我們一起Talk Flutter吧。 概念介紹 我們在這里介紹的setter/getter方法屬于編程語言中的…