刷題記錄(7)二叉樹

一、單值二叉樹

二叉樹為二叉鏈表形式,結點為:

大概看看題就知道這道題讓我們判斷一個樹到底所有結點的值是不是相同,相同就是單值二叉樹。在實現二叉樹相關操作的時候已經體會到了,遞歸來遍歷二叉樹是非常舒服的(做這些題本質都得遍歷)。

所以我們考慮考慮遞歸怎么個遞歸法,而二叉樹遞歸其實就是考慮根結點以及左右子樹之間的關系。

容易想到判斷根結點與左右孩子結點是否結點,當然,由于需要訪問左右孩子結點,根結點不能為空,而且因為訪問的是三個結點的值,所以肯定三個結點都得先保證不為空。

這個就有點講究了,根結點不能為空,假設剛好遍歷到一個空結點,空結點的值實際上并不是二叉樹實際上的值,對二叉樹是不是單值二叉樹不影響,所以碰見為空返回值需要不影響判斷結果。

接下來就是分別判斷左右子樹是不是也符合了,這個邏輯就簡單了,因為直接上遞歸就行,新的根結點分別是root->left和root->right,其它就沒了。

代碼表達:

只不過最后的遞歸直接省成一個布爾表達式了,因為能走到最后一個retrun語句至少說明根結點和它的左右孩子符合單值二叉樹,如果左右子樹同時符合單值二叉樹,那肯定就是單值二叉樹,但凡出現不符合的情況,我們給出來的語句都可以判斷,且有&&,一個不符合最后都是false。

測試通過:

提交通過:

二、相同的樹

給你一個樹,你得給我判斷出來到底是相同還是不同的,什么是相同的樹呢,結構和數值完全一樣的樹就是相同的樹。比如典例2,典型的數值一樣,但是同樣的根結點,左邊的樹,左孩子為2,右孩子為空;典例3這倆樹不看數值其實是完全一樣的,但是孩子結點的數值并不是一一對應的。

其實說來還是遍歷,只不過是同步遍歷,也就是這樣:

如果同步遍歷完了還沒有檢測出不一樣的結點,顯然就是相同的樹,否則就是不同的樹。

還是立足根結點寫出代碼,再用遞歸去判斷左右子樹的情況。

因為要判斷值,所以肯定保證根不為空,因為兩個根,所以就有三種情況了:

都為空,一個為空(顯然不是相同樹,因為同步遍歷),都不為空。

只不過需要注意的是第二個條件的寫法,全空已經排除過了,那至少有一個為非空,此時就剩下一個空一個非空和全非空,如果再有空豈不是就是一個空一個非空了嘛,直接return false就行,其它都簡單。

三、對稱二叉樹

這道題其實基本不用做了,因為如果相同二叉樹做出來了,那么對稱二叉樹很明顯就是每次遍歷的結點剛好走的路徑相反而已:

分類基本是模仿相同樹來的,當然,return啥肯定得對著典例寫。

比較容易弄錯的就是最后遞歸按鏡像走路,不過對著典例寫就行。

四、另一棵樹的子樹

其實這個題在我們做過判斷二叉樹是否相同以后就簡單了,遍歷整棵樹,如果找到和subRoot相同根結點的結點的值,這里就可能是子樹可能相同的地點,直接套判斷相同的樹的代碼就可以了。

root防止為空是考慮到了在遍歷的過程中可能一條路走到黑而導致觸發空結點,return false是作為遞歸的終點,代表這條路找不到能與subRoot這個根結點相同的值。

如果找到了,就判斷是否相同,不相同就一直遍歷,直到遍歷完整個樹。

但是代碼一碰見這蔫了,因為找到結點相同的了,就判斷是不是相同,那肯定不同啊,相當于這樣:

這樣能通過就怪了。

想出來個這修改真是艱難,因為判斷相等是肯定要有的,那干脆別以值相等做條件了,萬一前面有跟上面這個例子一樣,遞歸還沒展開,先找到相等的值,那不直接炸了,如果遞歸展開了,就不用老擔心:

這個圖就是遞歸已經展開了才被攔截,最后肯定還是能找到只有1的subRoot。

所以直接一點,改成有相等的樹才能返回true,不然就遍歷完整棵樹后返回false。

五、二叉樹的遍歷(前中后序)

遍歷的思想基本沒啥可講了,但是放在oj題里可沒有那么輕輕松松就能做出來:

比如前序遍歷,最難的其實不是前序遍歷完二叉樹,注意看最后的返回值,要的是int*類型的

但是實際上這道題的意思是最后把遍歷的數據放到數組最后返回數組的地址,這個數組還必須是動態開辟的數組,并且參數returnSize是用來確定遍歷到的二叉樹的結點的個數(最終存到數組內的元素個數)給遠程服務器,前序遍歷簡單,但是一個一個放這些數據就有點講究了。

上來問題就來了,那就是開辟多大空間的數組,那就免不了遍歷二叉樹去計算二叉樹結點個數:

準備好以后就該前序遍歷,并放到數組里:

最重要的就是寫出來怎么把現在遍歷到的根結點放到數組里,畢竟左子樹右子樹的遍歷僅僅是遞歸而已。

容易想到的是必須帶上偏移量,因為每次放置一個元素以后指針肯定要后移:

偏移量肯定不能傳形參,你在Dispose這個函數里面往這次的arr+i所指向的位置存了以后就該++了,但是如果傳值根本不能對偏移量i產生影響。

具體細節:

必須以i的地址為一個變量一直傳給preOrder函數,因為每次遞歸如果不傳i的地址,或者傳值,前者得到的結果就是每次進入新的遞歸以后都會新建一個int i = 0;這樣會造成偏移量實際沒有后移,因為每次進新函數棧幀都是重新定義i;后者傳值不會對偏移量產生影響,這個見過了。

成功通過,經過這道題掌握一種“常駐變量的改變”。

至于中序后序不多bb,調換個位置而已。

六、二叉樹的構建和遍歷

1.先序遍歷字符串構建二叉樹

2.二叉樹中序遍歷并輸出

難的就是第一步,直接畫圖看看最終生成的是一棵什么樣的樹,并在畫圖過程中體會代碼怎么寫:

容易得到,如果碰不到空結點,肯定得一直根左右,那么就是這樣的,接下來該返回到b了,因為c的根左右已經結束了:

緊接著就是遍歷d的左右子樹:

又碰到雙空就得回頭了:

再還原一下,檢驗正確。

最重要的遞歸構建樹:

其實也沒多高級,他說啥是啥,我們只需要注意先序遍歷構建的順序即可。

其它代碼很簡單,直接給出來了:

當然,這里輸入確實偷懶了。

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

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

相關文章

開源:FTP同步工具

文章目錄 簡介功能特性Windows (EXE)從源代碼構建依賴項Linux 構建Windows 構建 使用方法軟件截圖主界面FTP 設置快捷菜單定時設置 配置說明開發與貢獻許可證 歡迎來到盹貓的博客 本篇文章主要介紹了 [開源:FTP同步工具] ?博主廣交技術好友,喜歡我的文章的可以關注…

視頻質量測試點

目錄 功能/UI 端側性能 媒體質量 主觀 客觀 穩定性 兼容性 功能/UI 視頻預覽音頻預覽音視頻同步全屏收藏打賞 端側性能 PC端:內存占用、網絡帶寬占用等; 移動端:內存占用、功耗、發熱、流量消耗等; 媒體質量 主觀 音…

Ray框架:分布式AI訓練與調參實踐

Ray框架:分布式AI訓練與調參實踐 系統化學習人工智能網站(收藏):https://www.captainbed.cn/flu 文章目錄 Ray框架:分布式AI訓練與調參實踐摘要引言框架架構解析1. 核心組件設計2. 關鍵技術實現2.1 動態資源調度2.2 …

成都鼎訊硬核科技!雷達目標與干擾模擬器,以卓越性能制勝電磁頻譜戰

在現代戰爭中,電磁頻譜已成為繼陸、海、空、天之后的 “第五維戰場”,雷達作為電磁頻譜領域的關鍵裝備,其干擾與抗干擾能力的較量,直接影響著戰爭的勝負走向。由成都鼎訊科技匠心打造的雷達目標與干擾模擬器,憑借數字射…

ubuntu22.04 安裝docker 和docker-compose

首先你要確保沒有docker環境或者使用命令刪掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安裝docker 更新軟件環境 sudo apt update sudo apt upgrade下載docker依賴和GPG 密鑰 # 依賴 apt-get install ca-certificates curl gnupg lsb-rel…

2025 后端自學UNIAPP【項目實戰:旅游項目】6、我的收藏頁面

代碼框架視圖 1、先添加一個獲取收藏景點的列表請求 【在文件my_api.js文件中添加】 // 引入公共的請求封裝 import http from ./my_http.js// 登錄接口(適配服務端返回 Token) export const login async (code, avatar) > {const res await http…

20250609在榮品的PRO-RK3566開發板的Android13下解決串口可以執行命令但是腳本執行命令異常的問題

20250609在榮品的PRO-RK3566開發板的Android13下解決串口可以執行命令但是腳本執行命令異常的問題 2025/6/9 20:54 緣起,為了跨網段推流,千辛萬苦配置好了網絡參數。 但是命令iptables -t filter -F tetherctrl_FORWARD可以在調試串口/DEBUG口正確執行。…

【C/C++】高效的位操作

位運算(Bitwise Operation)是直接對整數的二進制位進行操作的運算方式,在底層開發、性能優化、算法設計中廣泛使用。 1 基本位運算符及含義 運算符名稱示例(a5, b3)運算過程(二進制)結果&按…

后端下載限速(redis記錄實時并發,bucket4j動態限速)

? 使用 Redis 記錄 所有用戶的實時并發下載數? 使用 Bucket4j 實現 全局下載速率限制(動態)? 支持 動態調整限速策略? 下載接口安全、穩定、可監控 🧩 整體架構概覽 模塊功能Redis存儲全局并發數和帶寬令牌桶狀態Bucket4j Redis分布式限…

android app 一個 crash的解決過程!

一、日志: crash 2024-10-25 12:15:33.020 2113-2113 AndroidRuntime pid-2113 E FATAL EXCEPTION: main Process: com..workhome, PID: 2113 java.lang.RuntimeException: Unable to start activity ComponentInfo{com..w…

[Java 基礎]Object 類

java.lang.Object 是 Java 所有類的直接或間接父類,Java 中每個類都默認繼承 Object 類(即使你沒寫 extends Object)。 Object 中的常用方法: 方法名功能簡介toString()返回對象的字符串表示equals(Object)判斷兩個對象是否“邏…

大數據學習(135)-Linux系統性指令

🍋🍋大數據學習🍋🍋 🔥系列專欄: 👑哲學語錄: 用力所能及,改變世界。 💖如果覺得博主的文章還不錯的話,請點贊👍收藏??留言📝支持一…

【Fifty Project - D35】

今日完成記錄 TimePlan完成情況7:00 - 7:40爬坡√8:30 - 11:30Rabbit MQ√17:30 - 18:30羽毛球√ RabbitMQ 消費者端如何保證可靠性? 消息投遞過程出現網絡故障消費者接收到消息但是突然宕機…

P3 QT項目----記事本(3.4)

3.4 文件選擇對話框 QFileDialog 3.4.1 QFileDialog 開發流程 使用 QFileDialog 的基本步驟通常如下: 實例化 :首先,創建一個 QFileDialog 對象的實例。 QFileDialog qFileDialog;設置模式 :根據需要設置對話框的模式&…

學習筆記(26):線性代數-張量的降維求和,簡單示例

學習筆記(26):線性代數-張量的降維求和,簡單示例 1.先理解 “軸(Axis)” 的含義 張量的 “軸” 可以理解為 維度的方向索引 。對于形狀為 (2, 3, 4) 的張量,3 個軸的含義是: 軸 0(axis0&…

健康檔案實訓室:構建全周期健康管理的數據基石

一、健康檔案實訓室建設背景 隨著“健康中國2030”戰略深入推進,健康檔案作為居民健康數據的核心載體,在疾病預防、慢性病管理、醫療決策等領域的價值日益凸顯。在此背景下,健康檔案實訓室建設成為職業院校對接政策要求、培養專業健康管理…

【MATLAB第119期】基于MATLAB的KRR多輸入多輸出全局敏感性分析模型運用(無目標函數,考慮代理模型)

【MATLAB第119期】基于MATLAB的KRR多輸入多輸出全局敏感性分析模型運用(無目標函數,考慮代理模型) 下一期研究SHAP的多輸入多輸出敏感性分析方法 一、SOBOL(無目標函數) (1)針對簡單線性數據…

Linux常用文件目錄命令

瀏覽目錄命令: ls 、pwd目錄操作命令:cd、mkdir、rmdir瀏覽文件命令:cat、more、less、head、tail文件操作命令:cp、rm、mv、find、grep、tar 瀏覽目錄命令 ls ? 命令名稱:ls ? 命令英文原意:list ? …

PIN碼vs密碼,電腦登錄的快捷鍵你用對了嗎?

你是否也遇到過這樣的窘境:信心滿滿地輸入電腦開機密碼,屏幕卻無情地提示“密碼錯誤”。仔細一看,才發現登錄界面悄悄地變成了要求輸入“PIN碼”。這種因為混淆了PIN碼和賬戶密碼而導致的開機失敗,相信不少朋友都碰到過。 PIN碼作…

【大模型科普】AIGC技術發展與應用實踐(一文讀懂AIGC)

【作者主頁】Francek Chen 【專欄介紹】 ? ? ?人工智能與大模型應用 ? ? ? 人工智能(AI)通過算法模擬人類智能,利用機器學習、深度學習等技術驅動醫療、金融等領域的智能化。大模型是千億參數的深度神經網絡(如ChatGPT&…