二叉樹算法題實戰:從遍歷到子樹判斷

目錄

一、引言

二、判斷兩棵二叉樹是否相同

思路

代碼實現

注意點

三、二叉樹的中序遍歷

思路

代碼實現

注意點

四、判斷一棵樹是否為另一棵樹的子樹

思路

代碼實現

注意點

?編輯

五、補充


一、引言

作者主頁:共享家9527-CSDN博客

作者代碼倉庫:

Study in the first semester of college.c: 大一下學期學習,主要內容為個人學習過程記錄

2025寒假C語言學習: 學習記錄

在算法學習和面試準備中,二叉樹相關題目是常見且重要的類型。本文將結合小米面試真題以及經典的二叉樹算法題,分享解題思路、代碼實現以及一些需要注意的點。

二、判斷兩棵二叉樹是否相同

思路

采用遞歸的方式,從根節點開始比較。如果兩個節點都為空,說明它們相同;如果其中一個為空,另一個不為空,則不同;如果兩個節點值不同,也不同。然后遞歸地比較它們的左子樹和右子樹。

代碼實現


cbool isSameTree(struct TreeNode* p, struct TreeNode* q) {if(p==NULL&&q==NULL) {return true;}if(p==NULL||q==NULL) {return false;}if(p->val!=q->val) {return false;}return isSameTree(p->left,q->left)&&isSameTree(p->right,q->right);}

注意點

1.?遞歸終止條件的判斷很關鍵,要先判斷兩個節點是否都為空,再判斷單個節點為空的情況。

2.?比較節點值時,注意數據類型的一致性。

三、二叉樹的中序遍歷

思路

中序遍歷的順序是左子樹、根節點、右子樹。通過遞歸的方式,先遍歷左子樹,然后將根節點的值存入結果數組,最后遍歷右子樹。在實現時,需要計算樹的節點數,以便為結果數組分配空間。

代碼實現


?

cvoid midtree(struct TreeNode* root,int* arr,int* returnSize) {if(root==NULL) {return;}midtree(root->left,arr,returnSize);arr[(* returnSize)++]=root->val;midtree(root->right,arr,returnSize);}int treesize(struct TreeNode* root) {if(root==NULL) {return 0;}return treesize(root->left)+treexize(root->right)+1;}int* inorderTraversal(struct TreeNode* root, int* returnSize) {*returnSize=0;int n=treesize(root);int *arr=(int*)malloc(sizeof(int)*n);midtree(root,arr,returnSize);return arr;}

注意點

1.?遞歸函數中對數組和元素個數的操作要注意順序和邊界。

2.?使用?malloc?分配內存后,調用者需要負責釋放內存,避免內存泄漏。

四、判斷一棵樹是否為另一棵樹的子樹

思路

先判斷當前兩棵樹是否相同(利用前面的?isSameTree?函數),如果相同則返回?true?;如果不同,則遞歸地在原樹的左子樹和右子樹中繼續查找是否存在與子樹相同的結構。

代碼實現


cbool isSameTree(struct TreeNode* p, struct TreeNode* q) {// 同前面判斷兩棵樹相同的代碼}bool isSubtree(struct TreeNode* root, struct TreeNode* subRoot) {if(root==NULL) {return false;}if(isSameTree(root,subRoot)) {return true;}return isSubtree(root->left,subRoot)||isSubtree(root->right,subRoot);}

注意點

1.?遞歸調用時,要注意對空指針的處理,避免空指針異常。

2.?邏輯或?||?的使用,只要在左子樹或右子樹中找到匹配的子樹即可。

五、補充

1.?二叉樹相關題目中,遞歸是常用的方法,但也可以使用棧等數據結構實現非遞歸版本,在時間和空間復雜度上可能會有所不同。

2.?在面試中,除了寫出正確的代碼,還要能夠清晰地闡述解題思路和時間、空間復雜度分析。

通過對這些二叉樹算法題的學習和實踐,我們能更好地掌握二叉樹的結構和操作,為應對算法面試和實際開發中的問題打下堅實基礎。

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

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

相關文章

【開原寶藏】30天學會CSS - DAY1 第一課

下面提供一個由淺入深、按步驟拆解的示例教程,讓你能從零開始,逐步理解并實現帶有旋轉及懸停動畫的社交圖標效果。為了更簡單明了,以下示例僅創建四個圖標(Facebook、Twitter、Google、LinkedIn),并在每一步…

HarmonyOS第22天:解鎖鴻蒙服務開發

走進鴻蒙服務開發的世界 在移動應用開發的領域中,HarmonyOS 以其獨特的分布式理念和強大的系統能力,為開發者們開辟了一片嶄新的天地。其中,服務開發作為 HarmonyOS 應用開發的關鍵環節,猶如一把神奇的鑰匙,能夠幫助開…

鴻蒙應用程序包HAP的開發與使用

1、HAP是什么? HAP(Harmony Ability Package)是應用安裝和運行的基本單元。HAP包是由代碼、資源、第三方庫、配置文件等打包生成的模塊包,其主要分為兩種類型:entry和feature。 entry:應用的主模塊&#x…

解決qt中自定插件加載失敗,不顯示問題。

這個問題斷斷續續搞了一天多,主要是版本不匹配問題。 我們先來看下 Based on Qt 6.6.0 → 說明 Qt Creator 本身 是基于 Qt 6.6.0 框架構建的。MSVC 2019, 64-bit → 說明 Qt Creator 是使用 Microsoft Visual C 2019 編譯器(64 位) 編譯的。…

進程間通信--匿名管道

進程間通信介紹 進程間通信目的 數據傳輸:一個進程需要將它的數據發送給另一個進程資源共享:多個進程之間共享同樣的資源。通知事件:一個進程需要向另一個或一組進程發送消息,通知它(它們)發生了某種事件&…

vue computed 計算屬性簡述

Vue 的 ?計算屬性(Computed Properties)? 是 Vue 實例中一種特殊的屬性,用于?聲明式地定義依賴其他數據動態計算得出的值?。它的核心優勢在于能夠自動追蹤依賴關系,并緩存計算結果,避免重復計算,提升性…

CSS塊元素、行內元素、行內塊元素詳解

一、塊元素(Block Elements) 1.定義與特點 獨占一行:默認情況下,塊元素會從新的一行開始,并且其后的元素也會被推到下一行。可設置寬高:可以自由設置寬度(width)和高度&#xff08…

Vue3項目中可以嘗試封裝那些組件

在 Vue 3 項目中,組件的封裝可以根據功能、復用性和業務需求進行劃分。以下是一些常見的組件類型,適合封裝為獨立組件: 1. 基礎 UI 組件 按鈕 (Button) 封裝不同樣式、大小、狀態的按鈕。支持 disabled、loading 等狀態。 輸入框 (Input) 封…

2025年AI搜索引擎開源項目全景指南:從核心框架到生態工具

2025年AI搜索引擎開源項目全景指南:從核心框架到生態工具 在人工智能技術迅猛發展的當下,開源項目已成為構建AI搜索引擎的核心驅動力。本文整理9個具有代表性的開源項目,涵蓋搜索框架、擴展生態及底層支持技術,助你快速搭建或優化…

Word 小黑第22套

對應大貓23 續編號(編號斷了,從一開始):點編號,再設置編號值 插入以圖標方式顯示的文檔:插入 -對象 -由文件創建 (這里要鏈接到文件也要勾選 不然扣一分) 一個頁面設為橫向不影響上…

平面波揚聲器 VS球面波揚聲器的原理與優缺點對比

一、核心定義與原理 1、平面波揚聲器 1.1、平面波揚聲器的定義?:通過“相控陣”技術控制聲波相位,使聲波以平行線(面)定向傳播的揚聲器,聲波近似平面振動,能量集中且衰減緩慢?。 1.2、平面波揚聲器的原…

設計模式之命令設計模式

命令設計模式(Command Pattern) 請求以命令的形式包裹在對象中,并傳給調用對象。調用對象尋找可以處理該命令的對象,并把該命令傳給相應的對象執行命令,屬于行為型模式命令模式是一種特殊的策略模式,體現的…

EcoVadis新增可持續發展徽章

EcoVadis新增的兩項新徽章旨在進一步激勵和表彰企業在可持續發展方面的努力和成就。以下是這兩項新徽章的概述: 可持續發展之旅徽章(Sustainability Journey Badge): 目的:表彰那些在可持續發展方面展現出持續進步和承…

力扣hot100二刷——二叉樹

第二次刷題不在idea寫代碼,而是直接在leetcode網站上寫,“逼”自己掌握常用的函數。 標志掌握程度解釋辦法?Fully 完全掌握看到題目就有思路,編程也很流利??Basically 基本掌握需要稍作思考,或者看到提示方法后能解答???Sl…

從“自習室令牌”到線程同步:探秘鎖與條件變量

目錄 互斥 為什么需要鎖 鎖的原理--互斥 鎖的使用 同步 鎖的問題 條件變量 互斥 為什么需要鎖 先看結果&#xff1a; 以下代碼是我模擬創建線程搶票&#xff0c;由于不加鎖導致票搶到了負數 main.cc: #include<vector> #include<iostream> #include"…

字符串哈希從入門到精通

一、基本概念 字符串哈希是將任意長度的字符串映射為固定長度的哈希值&#xff08;通常為整數&#xff09;的技術&#xff0c;核心目標是實現O(1)時間的子串快速比較和高效查詢。其本質是通過數學運算將字符串轉換為唯一性較高的數值&#xff0c;例如&#xff1a; ??????…

什么是數學建模?數學建模是將實際問題轉化為數學問題

數學建模是將實際問題轉化為數學問題&#xff0c;并通過數學工具進行分析、求解和驗證的過程。 一、數學建模的基本流程 問題分析 ? 明確目標&#xff1a;確定需要解決的核心問題。 ? 簡化現實&#xff1a;識別關鍵變量、忽略次要因素。 ? 定義輸入和輸出&#xff1a;明確模…

搭建主從服務器

任務需求 客戶端通過訪問 www.nihao.com 后&#xff0c;能夠通過 dns 域名解析&#xff0c;訪問到 nginx 服務中由 nfs 共享的首頁文件&#xff0c;內容為&#xff1a;Very good, you have successfully set up the system. 各個主機能夠實現時間同步&#xff0c;并且都開啟防…

【python web】一文掌握 Flask 的基礎用法

文章目錄 一、 Flask 介紹1.1 安裝 Flask二、Flask的基本使用2.1 創建第一個 Flask 應用2.2 路由與視圖函數2.3 請求與響應2.4 響應對象2.5 模板渲染2.6 模板繼承2.7 靜態文件管理2.8 Blueprint 藍圖2.9 錯誤處理三、Flask擴展與插件四、部署 Flask 應用五、總結Flask 是一個輕…

最長最短單詞(信息學奧賽一本通-1143)

【題目描述】 輸入1行句子(不多于200個單詞&#xff0c;每個單詞長度不超過100)&#xff0c;只包含字母、空格和逗號。單詞由至少一個連續的字母構成&#xff0c;空格和逗號都是單詞間的間隔。 試輸出第1個最長的單詞和第1個最短單詞。 【輸入】 一行句子。 【輸出】 第1行&…