Java二叉樹題目練習

Java二叉題目練習

  • 相同的樹
  • 對稱二叉樹
  • 平衡二叉樹
  • 二叉樹的最近公共祖先
  • 二叉樹的層序遍歷
  • 二叉樹層序遍歷 ||
  • 二叉樹遍歷

相同的樹

二叉樹的題目大多數時候就可以采用遞歸的方法寫
因為二叉樹是由根左子樹和右子樹組成,每一棵左子樹和右子樹又可以被看成一顆完整的樹,因此大事化小,小事化了

在這里插入圖片描述

目的:就是判斷兩個樹是完全相同
思路:采用遞歸的方法,因為在二叉樹中樹是由根、左子樹和右子樹組成,每一個左子樹和右子樹又可以被看成一顆完整的樹,因此這里重要的是找好遞歸的截止條件就行

在這里插入圖片描述

class Solution {public boolean isSameTree(TreeNode p, TreeNode q) {//都為空的話就返回trueif(p==null&&q==null){return true;}//一個為空,一個不為空的話就返回falseif(p==null&&q!=null||p!=null&&q==null){return false;}//值不相同返回falseif(p.val!=q.val){return false;}//兩個不為空且值相同的話就繼續遞歸return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);}
}

在這里插入圖片描述
在這里插入圖片描述

對稱二叉樹

在這里插入圖片描述

class Solution {public boolean isSymmetric(TreeNode root) {//為空的話就返回trueif(root==null){return true;}//利用判斷是否相同的方法return isSymmetrichild(root.left,root.right);}public boolean isSymmetrichild(TreeNode left,TreeNode right){if(left==null&&right!=null||left!=null&&right==null){return false;}if(left==null&&right==null){return true;}if(left.val!=right.val){return false;}return isSymmetrichild(left.left,right.right)&&isSymmetrichild(left.right,right.left);}
}

平衡二叉樹

在這里插入圖片描述

目的:一棵樹左右深度差不大于1就是平衡二叉樹
這里從底到頂進行向上返回
思路:函數Height(root)來求其左子樹和右子樹深度差
返回值:
如果其深度差<=1:返回當前深度,
如果深度差>1就返回-1
中止條件:
root為空時候,說明找完了,返回當前高度為0
左子樹/右子樹深度為-1,或者深度差>1就返回-1,說明不是平衡二叉樹

在這里插入圖片描述

class Solution {public boolean isBalanced(TreeNode root) {if(root==null){return true;}return Height(root)!=-1;      }//求樹的深度差public int Height(TreeNode root){if(root==null){return 0;}//求出左子樹和右子樹int left = Height(root.left);if(left<0){return -1;}int right = Height(root.right);if(right<0){return -1;}if(left>=0&&right>=0&&Math.abs(left-right)<=1){return left>right? left+1:right+1;}else{return -1;}}
}
如果這里不是平衡二叉樹,Height函數返回-1,如果是就返回其長度
所有子在isBalanced,只要判斷其返回是否是-1就行

在這里插入圖片描述
在這里插入圖片描述

二叉樹的最近公共祖先

在這里插入圖片描述

目的:就是一棵二叉樹中的兩個節點p和q,找這兩個節點最近相同的公共祖先
思路:就是在root樹的左子樹和右子樹中找p和q,注意每一顆左子樹和右子樹又分別是一顆完整的樹
截止:找到節點或者root為null
返回值:如果left和right都不為null,那他們的祖先就是root節點
如果left != null ,返回left節點
如果right != null,返回right節點

在這里插入圖片描述

class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {//1.判斷是否為空if(root==null){return null;}//2.是否找到p或者qif(root==q||root == p){return root;}//3.遞歸左子樹和右子樹進行判斷TreeNode left = lowestCommonAncestor(root.left,p,q);TreeNode right = lowestCommonAncestor(root.right,p,q);if(left!=null&&right!=null){return root;}else if(left!=null){return left;}else{return right;}}
}

二叉樹的層序遍歷

在這里插入圖片描述

目的:就是層序輸出從上到下每一層的節點,這里返回List<List< Integer >>這個二維列表
思路:二維鏈表就是由許多一維列表組成,確定每一行的一維鏈表放入二維鏈表中就行
這里使用Queue隊列來完成存放,知道隊列先入先出的原則
1.先把root節點放入隊列中
2.求出隊列長度,確定每一行要出多少數放入一維隊列中,出隊列
3.判斷這個出去的節點左右子樹是否為空,不為空的入隊列
4.最后將一鏈表表放入二維鏈表中
5.當對列為空的時候就結束了

在這里插入圖片描述

在這里插入圖片描述
在這里插入圖片描述

注意每次出隊列的時候要計算其此時隊列長度,這個長度就代表自己這一次要出隊列元素個數
class Solution {public  levelOrder(TreeNode root) {//將其層序遍歷分開行就行List<List<Integer>> ret = new ArrayList();if(root==null){return ret;}Queue<TreeNode> queue = new LinkedList<>();//先把頭節點放進去queue.offer(root);while (!queue.isEmpty()){List<Integer> curRow = new ArrayList();//求隊列長度確定出多少隊列元素int size = queue.size();while(size!=0){//出隊列TreeNode cur = queue.poll();curRow.add(cur.val);//判斷出棧的這個左子樹和右子樹是否為空if(cur.left!=null){queue.offer(cur.left);}if(cur.right!=null){queue.offer(cur.right);}size--;}ret.add(curRow);}return ret;}
}

二叉樹層序遍歷 ||

在這里插入圖片描述

目的:從下到上層序遍歷
思路:和上面從上到下的層序遍歷思路一樣,就是最后一步的將一位鏈表放入二維鏈表中采用頭插法,這樣就會將其反過來了

class Solution {public  levelOrder(TreeNode root) {//將其層序遍歷分開行就行List<List<Integer>> ret = new ArrayList();if(root==null){return ret;}Queue<TreeNode> queue = new LinkedList<>();//先把頭節點放進去queue.offer(root);while (!queue.isEmpty()){List<Integer> curRow = new ArrayList();int size = queue.size();while(size!=0){//出隊列TreeNode cur = queue.poll();curRow.add(cur.val);//判斷出棧的這個左子樹和右子樹是否為空if(cur.left!=null){queue.offer(cur.left);}if(cur.right!=null){queue.offer(cur.right);}size--;}ret.add(curRow);}return ret;}
}

二叉樹遍歷

在這里插入圖片描述

目的:就是給你一個前序遍歷字符串(由字母和‘#’構成),’ # '表示的是空格,并中序打印
思路:1.先輸入一個字符串
2.創建這棵樹
3.中序遍歷打印
已知先序遍歷:根-》左子樹-》右子樹
中序遍歷:左子樹-》根-》右子樹

在這里插入圖片描述
在這里插入圖片描述
在這里插入圖片描述

這里注意要先寫構造樹的類,這里創建樹采用遞歸
因為每一棵樹的左子樹和右子樹分別可以看成一顆完整的樹
這里再遞歸的時候,每個節點的左子樹和右子樹回遞歸,回歸的時候回將回歸這兩個節點鏈接起來
import java.util.Scanner;
//樹的構造方法類
class TreeNode{public char val;public TreeNode left;public TreeNode right;//構造方法給其val賦值public TreeNode(char val){this.val = val;}
}
// 注意類名必須為 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner in = new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的區別while (in.hasNextLine()) { // 注意 while 處理多個 case//1.輸入字符串String str = in.nextLine();//2.構建二叉樹TreeNode root = creatTree(str);//3.中序遍歷打印二叉樹inorder(root);}}//確定遍歷到那個字符public static int i = 0;public static TreeNode creatTree(String str){char ch = str.charAt(i);TreeNode root = null;if(ch!='#'){//將這個放入樹中root = new TreeNode(ch);i++;//指向下一個root.left = creatTree(str);root.right = creatTree(str);}else{i++;}return root;}//打印public static void inorder(TreeNode root){if(root == null){return;}inorder(root.left);System.out.print(root.val+" ");inorder(root.right);}
}

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

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

相關文章

【全網首發】解決coze工作流批量上傳excel數據文檔數據重復的問題

注意&#xff1a;目前方法將基于前一章批量數據庫導入的修改&#xff01;&#xff01;&#xff01;&#xff01;請先閱讀上篇文章的操作。抄襲注明來源 背景 上一節說的方法可以批量導入文件到數據庫&#xff0c;但是無法解決已經上傳的條目更新問題。簡單來說&#xff0c;不…

dockerdesktop 重新安裝

1、卸載 dockerdesktop 卸載時&#xff0c;最后一步刪除鏡像文件 會卡住 取消 2、在資源管理器中將鏡像文件路徑改名 如&#xff1a;e:\docker 修改 e:\docker1 3、重新安裝wsl wsl --shutdown 以管理員身份運行hy.bat pushd "%~dp0" dir /b %SystemRoot%\servic…

Linux docker常用命令

1、docker服務相關命令 啟動docker服務&#xff1a;systemctl start docker 停止docker服務&#xff1a;systemctl stop docker 重啟docker服務&#xff1a;systemctl restart docker 查看docker服務狀態&#xff1a;systemctl status docker 設置開機啟動docker服務&#xff1…

南京郵電大學金工實習答案

一、金工實習的定義 金工實習是機械類專業學生一項重要的實踐課程&#xff0c;它絕非僅僅只是理論知識在操作層面的簡單驗證&#xff0c;而是一個全方位培養學生綜合實踐能力與職業素養的系統工程。從本質上而言&#xff0c;金工實習是學生走出教室&#xff0c;親身踏入機械加…

Java EE初階——wait 和 notify

1. 線程饑餓 線程饑餓是指一個或多個線程因長期無法獲取所需資源&#xff08;如鎖&#xff0c;CPU時間等&#xff09;而持續處于等待狀態&#xff0c;導致其任務無法推進的現象。 典型場景 優先級搶占&#xff1a; 在支持線程優先級的系統中&#xff0c;高優先級線程可能持續…

MATLAB中heatmap函數

無論對表格還是對矩陣的可視化&#xff0c;都非常好用。 樣本特征 高斯核 https://ww2.mathworks.cn/help/matlab/creating_plots/create-heatmap-from-tabular-data.html

win11安裝Joplin Server私有化部署(docker)

摘要 本指南將幫助你在 Windows 11 系統 上通過 Docker Docker Compose 完成 Joplin Server 的本地搭建&#xff0c;并實現數據持久化、PostgreSQL 后端支持、用戶登錄與同步功能。 條件說明? 已安裝 Docker Desktop for Windows可從 Docker 官網 下載并安裝&#xff0c;建議…

嵌入式STM32學習——外部中斷EXTI與NVIC的基礎練習?

按鍵控制LED燈 按鍵控制LED的開發流程&#xff1a; 第一步&#xff1a;使能功能復用時鐘 第二布&#xff0c;配置復用寄存器 第三步&#xff0c;配置中斷屏蔽寄存器 固件庫按鍵控制LED燈 外部中斷EXTI結構體&#xff1a;typedef struct{uint32_t EXTI_Line; …

《Deepseek從入門到精通》清華大學中文pdf完整版

資源介紹&#xff1a; 《DeepSeek&#xff1a;從入門到精通》是由清華大學新聞與傳播學院新媒體研究中心元宇宙文化實驗室的精心撰寫的一份專業文檔。該文檔以通俗易懂的方 式&#xff0c;全面介紹了DeepSeek的使用方法&#xff0c;為用戶提供了極具價值的指導。 這份文檔內容豐…

Apache Pulsar 消息、流、存儲的融合

Apache Pulsar 消息、流、存儲的融合 消息隊列在大層面有兩種不同類型的應用&#xff0c;一種是在線系統的message queue&#xff0c;一種是流計算&#xff0c;data pipeline的streaming高throughout&#xff0c;一致性較低&#xff0c;延遲較差的過程。 存算分離 擴容和縮容快…

JavaScript vs Python 用于 Web Scraping(2025):終極對比指南

1. 引言 在不斷發展的 Web Scraping 領域&#xff0c;選擇合適的編程語言對于項目的成功至關重要。雖然 JavaScript 和 Python 在 2025 年仍然是 Web Scraping 領域的熱門選擇&#xff0c;但它們各自具備不同的優勢和挑戰。 本指南將深入分析 JavaScript 和 Python 的核心特性…

【RocketMQ Broker 相關源碼】- NettyRemotingClient 和 NettyRemotingServer

文章目錄 1. 前言2. BrokerOuterAPI2.1 NettyRemotingClient2.2 start 啟動2.2.1 NettyRemotingClient#start 3. NettyRemotingServer3.1 ClientHousekeepingService3.2 ProducerManager#doChannelCloseEvent3.3 ConsumerManager#doChannelCloseEvent3.3.1 DefaultConsumerIdsC…

C++性能測試工具——AMD CodeAnalyst及其新工具的使用

一、CodeAnalyst及其新的替代工具 與VTune相比&#xff0c;AMD也有自己的性能測試工具&#xff0c;也就是CodeAnalyst。不過目前看&#xff0c;其應該已經有些過時&#xff0c;目前AMD提供了更新的性能測試工具uProf或CodeXL&#xff0c;這些新工具的優點在于對新的硬件架構和…

ProfibusDP主站轉modbusTCP網關與ABB電機保護器數據交互

ProfibusDP主站轉modbusTCP網關與ABB電機保護器數據交互 在工業自動化領域&#xff0c;Profibus DP&#xff08;Process Field Bus&#xff09;和Modbus TCP是兩種常見的通訊協議&#xff0c;它們各自在不同的場合發揮著重要作用。然而&#xff0c;隨著技術的發展和應用需求的…

2025.05.17淘天機考筆試真題第三題

&#x1f4cc; 點擊直達筆試專欄 &#x1f449;《大廠筆試突圍》 &#x1f4bb; 春秋招筆試突圍在線OJ &#x1f449; 筆試突圍OJ 03. 奇偶平衡樹分割問題 問題描述 K小姐是一位園林設計師&#xff0c;她設計了一個由多個花壇組成的樹形公園。每個花壇中種植了不同數量的花…

第三十五節:特征檢測與描述-ORB 特征

1. 引言:為什么需要ORB? 在計算機視覺領域,特征檢測與描述是許多任務(如圖像匹配、目標跟蹤、三維重建等)的核心基礎。傳統的算法如SIFT(尺度不變特征變換)和SURF(加速穩健特征)因其優異的性能被廣泛應用,但它們存在兩個顯著問題: 專利限制:SIFT和SURF受專利保護,…

深入解讀WPDRRC信息安全模型:構建中國特色的信息安全防護體系

目錄 前言1 WPDRRC模型概述2 模型結構詳解2.1 預警&#xff08;Warning&#xff09;2.2 保護&#xff08;Protect&#xff09;2.3 檢測&#xff08;Detect&#xff09;2.4 響應&#xff08;React&#xff09;2.5 恢復&#xff08;Restore&#xff09;2.6 反擊&#xff08;Count…

《算法導論(第4版)》閱讀筆記:p82-p82

《算法導論(第4版)》學習第 17 天&#xff0c;p82-p82 總結&#xff0c;總計 1 頁。 一、技術總結 1. Matrix Matrices(矩陣) (1)教材 因為第 4 章涉及到矩陣&#xff0c;矩陣屬于線性代數(linear algebra)范疇&#xff0c;如果不熟悉&#xff0c;可以看一下作者推薦的兩本…

基于Spring Boot和Vue的在線考試系統架構設計與實現(源碼+論文+部署講解等)

源碼項目獲取聯系 請文末卡片dd我獲取更詳細的演示視頻 系統介紹 基于Spring Boot和Vue的在線考試系統。為學生和教師/管理員提供一個高效、便捷的在線學習、考試及管理平臺。系統采用前后端分離的架構&#xff0c;后端基于成熟穩定的Spring Boot框架&#xff0c;負責數據處理…

Codeforces Round 1024 (Div.2)

比賽鏈接&#xff1a;CF1024 A. Dinner Time 只有當 n n n 是 p p p 的倍數而且 n ? q p ? m \frac{n \cdot q}{p} \not m pn?q?m 時輸出 NO&#xff0c;其余情況均滿足條件。 時間復雜度&#xff1a; O ( 1 ) O(1) O(1)。 #include <bits/stdc.h> using na…