平衡二叉樹,二叉樹的路徑,左葉子之和

第六章?? 二叉樹part04

今日內容:?

  1. ?110.平衡二叉樹?
  1. ?257.?二叉樹的所有路徑?
  1. ?404.左葉子之和?

?110.平衡二叉樹?(優先掌握遞歸)

給定一個二叉樹,判斷它是否是高度平衡的二叉樹。

本題中,一棵高度平衡二叉樹定義為:一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1

示例 1:

給定二叉樹 [3,9,20,null,null,15,7]

返回 true

示例 2:

給定二叉樹 [1,2,2,3,3,null,null,4,4]

返回 false

遞歸法:

遞歸三步曲分析:

  1. 明確遞歸函數的參數和返回值

參數:當前傳入節點。 返回值:以當前傳入節點為根節點的樹的高度。那么如何標記左右子樹是否差值大于1呢?

如果當前傳入節點為根節點的二叉樹已經不是二叉平衡樹了,還返回高度的話就沒有意義了。

所以如果已經不是二叉平衡樹了,可以返回-1 來標記已經不符合平衡樹的規則了。

  1. 明確終止條件

遞歸的過程中依然是遇到空節點了為終止,返回0,表示當前節點為根節點的樹高度為0

  1. 明確單層遞歸的邏輯

如何判斷以當前傳入節點為根節點的二叉樹是否是平衡二叉樹呢?當然是其左子樹高度和其右子樹高度的差值。

分別求出其左右子樹的高度,然后如果差值小于等于1,則返回當前二叉樹的高度,否則返回-1,表示已經不是二叉平衡樹了。

/**

?* Definition for a binary tree node.

?* public class TreeNode {

?* ? ? int val;

?* ? ? TreeNode left;

?* ? ? TreeNode right;

?* ? ? TreeNode() {}

?* ? ? TreeNode(int val) { this.val = val; }

?* ? ? TreeNode(int val, TreeNode left, TreeNode right) {

?* ? ? ? ? this.val = val;

?* ? ? ? ? this.left = left;

?* ? ? ? ? this.right = right;

?* ? ? }

?* }

?*/

class Solution {

? ? public boolean isBalanced(TreeNode root) {

? ? ? ? return getHeight(root)!=-1;

? ? }

? ? public int getHeight(TreeNode root)

? ? {

? ? ? ? if(root==null) return 0;

? ? ? ? int leftHeight = getHeight(root.left);

? ? ? ? if(leftHeight==-1)return -1;

? ? ? ? int rightHeight = getHeight(root.right);

? ? ? ? if(rightHeight==-1)return -1;

? ? ? ? if(Math.abs(leftHeight-rightHeight)>1) return -1;

? ? ? ? else return Math.max(leftHeight,rightHeight)+1;

? ? }

}

257.?二叉樹的所有路徑?

給定一個二叉樹,返回所有從根節點到葉子節點的路徑

思路

這道題目要求從根節點到葉子的路徑,所以需要前序遍歷,這樣才方便讓父節點指向孩子節點,找到對應的路徑。

在這道題目中將第一次涉及到回溯,因為我們要把路徑記錄下來,需要回溯來回退一個路徑再進入另一個路徑。

遞歸

  1. 遞歸函數參數以及返回值

要傳入根節點,記錄每一條路徑的path,和存放結果集的result,這里遞歸不需要返回值。

  1. 確定遞歸終止條件

本題要找到葉子節點,就開始結束的處理邏輯了(把路徑放進result里)。

那么什么時候算是找到了葉子節點??是當 cur不為空,其左右孩子都為空的時候,就找到葉子節點。

  1. 確定單層遞歸邏輯

因為是前序遍歷,需要先處理中間節點,中間節點就是我們要記錄路徑上的節點,先放進path中。

然后是遞歸和回溯的過程,上面說過沒有判斷cur是否為空,那么在這里遞歸的時候,如果為空就不進行下一層遞歸了。

回溯和遞歸是一一對應的,有一個遞歸,就要有一個回溯。

/**

?* Definition for a binary tree node.

?* public class TreeNode {

?* ? ? int val;

?* ? ? TreeNode left;

?* ? ? TreeNode right;

?* ? ? TreeNode() {}

?* ? ? TreeNode(int val) { this.val = val; }

?* ? ? TreeNode(int val, TreeNode left, TreeNode right) {

?* ? ? ? ? this.val = val;

?* ? ? ? ? this.left = left;

?* ? ? ? ? this.right = right;

?* ? ? }

?* }

?*/

class Solution {

? ? public List<String> binaryTreePaths(TreeNode root) {

? ? ? ? List<String> result = new ArrayList<>();

? ? ? ? List<Integer> paths = new ArrayList<>();

? ? ? ? if(root==null) return result;

? ? ? ? travesal(root,result,paths);

? ? ? ? return result;

? ? }

? ? public void travesal(TreeNode root,List<String> result,List<Integer> paths)

? ? {

? ? ? ? paths.add(root.val);

? ? ? ? if(root.left==null&&root.right==null)

? ? ? ? {

? ? ? ? ? ? StringBuilder sb = new StringBuilder();

? ? ? ? ? ? for(int i=0;i<paths.size()-1;i++) ?sb.append(paths.get(i)).append("->");

? ? ? ? ? ? sb.append(paths.get(paths.size()-1));

? ? ? ? ? ? String path = sb.toString();

? ? ? ? ? ? result.add(path);

? ? ? ? ? ? return;

? ? ? ? }

? ? ? ? if(root.left!=null)

? ? ? ? {

? ? ? ? ? ? travesal(root.left,result,paths);

? ? ? ? ? ? paths.remove(paths.size()-1);

? ? ? ? }

? ? ? ? if(root.right!=null)

? ? ? ? {

? ? ? ? ? ? travesal(root.right,result,paths);

? ? ? ? ? ? paths.remove(paths.size()-1);

? ? ? ? }

? ? }

}

404.左葉子之和?(優先掌握遞歸)

計算給定二叉樹的所有左葉子之和。

首先要注意是判斷左葉子,不是二叉樹左側節點,所以不要上來想著層序遍歷。

節點A的左孩子不為空,且左孩子的左右孩子都為空(說明是葉子節點),那么A節點的左孩子為左葉子節點

判斷當前節點是不是左葉子是無法判斷的,必須要通過節點的父節點來判斷其左孩子是不是左葉子。

遞歸法

遞歸的遍歷順序為后序遍歷(左右中),是因為要通過遞歸函數的返回值來累加求取左葉子數值之和。

遞歸三部曲:

  1. 確定遞歸函數的參數和返回值

判斷一個樹的左葉子節點之和,那么一定要傳入樹的根節點,遞歸函數的返回值為數值之和,所以為int使用題目中給出的函數就可以了。

  1. 確定終止條件

如果遍歷到空節點,那么左葉子值一定是0

只有當前遍歷的節點是父節點,才能判斷其子節點是不是左葉子。 所以如果當前遍歷的節點是葉子節點,那其左葉子也必定是0

  1. 確定單層遞歸的邏輯

當遇到左葉子節點的時候,記錄數值,然后通過遞歸求取左子樹左葉子之和,和 右子樹左葉子之和,相加便是整個樹的左葉子之和。

/**

?* Definition for a binary tree node.

?* public class TreeNode {

?* ? ? int val;

?* ? ? TreeNode left;

?* ? ? TreeNode right;

?* ? ? TreeNode() {}

?* ? ? TreeNode(int val) { this.val = val; }

?* ? ? TreeNode(int val, TreeNode left, TreeNode right) {

?* ? ? ? ? this.val = val;

?* ? ? ? ? this.left = left;

?* ? ? ? ? this.right = right;

?* ? ? }

?* }

?*/

class Solution {

? ? public int sumOfLeftLeaves(TreeNode root) {

? ? ? ? if(root==null) return 0;

? ? ? ? if(root.left==null&&root.right==null) return 0;

? ? ? ? int leftSum = sumOfLeftLeaves(root.left);

? ? ? ? if(root.left!=null&&root.left.left==null&&root.left.right==null)

? ? ? ? leftSum = root.left.val;

? ? ? ? int rightSum = sumOfLeftLeaves(root.right);

? ? ? ? int sum = leftSum+rightSum;

? ? ? ? return sum;

? ? }

}

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

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

相關文章

【不可不知的考研復試秘籍 1】

----------------------------------------------------------------------------------------------------- 考研復試科研背景提升班 教你快速深入了解掌握考研復試面試中的常見問題以及注意事項&#xff0c;系統的教你如何在短期內快速提升自己的專業知識水平和編程以及英語…

windows下安裝cnpm

cnpm是淘寶團隊開發的一個針對中國用戶的npm鏡像源&#xff0c;它是npm的一個定制版本。由于國外的npm源在國內訪問速度較慢&#xff0c;所以cnpm鏡像源可以提供更快的下載速度。cnpm的使用方式與npm基本相同&#xff0c;只需將npm替換為cnpm即可。 要想使用cnpm等先安裝node.…

反序列化逃逸 [安洵杯 2019]easy_serialize_php1

打開題目 題目源碼&#xff1a; <?php$function $_GET[f];function filter($img){$filter_arr array(php,flag,php5,php4,fl1g);$filter /.implode(|,$filter_arr)./i;return preg_replace($filter,,$img); }if($_SESSION){unset($_SESSION); }$_SESSION["user&qu…

每日一題 KY148還是暢通工程

某省調查鄉村交通狀況&#xff0c;得到的統計表中列出了任意兩村莊間的距離。省政府“暢通工程”的目標是使全省任何兩個村莊間都可以實現公路交通&#xff08;但不一定有直接的公路相連&#xff0c;只要能間接通過公路可達即可&#xff09;&#xff0c;并要求鋪設的公路總長度…

PostgreSQL對已有表增加自增序列

對已有表增加自增序列&#xff1a; 1、在PostgreSQL當中&#xff0c;我們要實現對已有表的ID字段自增。 首先需創建一個關聯序列&#xff0c;以下sql語句是創建一個序列&#xff1a; CREATE SEQUENCE menu_id_seq START 6000001; 序列名稱是menu_id_seq&#xff0c;起始…

sizeof 和 strlen的區別

sizeof sizeof是單目操作符,sizeof計算變量所棧內存空間大小,單位是字節,如果操作數是類型的話,會計算類型所占大小,sizeof指在乎占用內存空間大小不在乎內容是什么. int main() {int a 0;printf("%zd\n", sizeof(a));printf("%zd\n", sizeof a );printf…

巧【二叉搜索樹的最近公共祖先】【二叉搜索樹的性質】Leetcode 235. 二叉搜索樹的最近公共祖先

【二叉搜索樹的最近公共祖先】【二叉搜索樹性質】Leetcode 235. 二叉搜索樹的最近公共祖先 【巧】解法1 利用二叉搜索樹有序的性質解法2 采用二叉樹求最近公共祖先的方法——后序遍歷 ---------------&#x1f388;&#x1f388;235. 二叉搜索樹的最近公共祖先 題目鏈接&#x…

huggingface上傳或發布自己的模型(大語言模型LLM)

創建huggingface賬號和token 在https://huggingface.co/join注冊huggingface賬號&#xff0c;登錄賬號后&#xff0c;在https://huggingface.co/settings/tokens創建token&#xff0c;注意需要將token的類型設置為WRITE。 安裝必要軟件包和初始化環境 安裝git lfs curl -s …

Springboot+vue的制造裝備物聯及生產管理ERP系統(有報告)。Javaee項目,springboot vue前后端分離項目。

演示視頻&#xff1a; Springbootvue的制造裝備物聯及生產管理ERP系統&#xff08;有報告&#xff09;。Javaee項目&#xff0c;springboot vue前后端分離項 項目介紹&#xff1a; 本文設計了一個基于Springbootvue的制造裝備物聯及生產管理ERP系統&#xff0c;采用M&#xff…

WebSocket協議及其在實時通信中的重要性

本文深入介紹了WebSocket協議及其在實時通信中的重要性。從HTTP的限制到WebSocket的優勢&#xff0c;再到連接建立和實際應用&#xff0c;全面闡述了WebSocket的工作原理及其在實際業務中的應用場景。 一、引言 在生產中&#xff0c;有時需要服務端向客戶端發送消息&#xff0…

三元組的最小距離

題目鏈接&#xff1a; 三元組最小距離 定義三元組 $(a, b, c)$&#xff08;$a,b,c$ 均為整數&#xff09;的距離 $D|a-b||b-c||c-a|$。 給定 $3$ 個非空整數集合 $S_1, S_2, S_3$&#xff0c;按升序分別存儲在 $3$ 個數組中。 請設計一個盡可能高效的算法&#xff0c;計算并…

AI學習集合-前瞻

AI學習前瞻 工作崗位 算法工程師機器學習工程師圖像算法工程師ai工程師NLP高級算法工程師 學習路線 應用場景 計算機視覺技術應用場景 自然語言應用 AI流程 AI擬人流程 機器人歷史數據經驗模型規律依據模型預測未來依據規律做出判斷 AI基本流程 術語所用到的技術手段數據數…

javascript中對包含關系判斷介紹

本文將為您詳細講解 JavaScript 中對包含關系的判斷&#xff0c;包括數組、字符串等&#xff0c;并提供相應的代碼例子。 1. 數組包含關系判斷 在 JavaScript 中&#xff0c;數組包含關系判斷通常使用 Array.prototype.includes() 方法。這個方法返回一個布爾值&#xff0c;表示…

牛客網C++專項題目整理(2)

1.參加位運算的數據可以是任何類型的數據。請問這句話的說法是正確的嗎&#xff1f; 答案&#xff1a;錯誤 位運算符主要用于整型數據&#xff08;如int、unsigned int、long、unsigned long等&#xff09;和字符型數據&#xff08;如char和unsigned char&#xff09;&#x…

mac 本地使用dockerfile啟動 springboot項目

1.創建Dockerfile放在項目的根目錄下 2.編寫Dockerfile FROM openjdk:11 MAINTAINER ChengLinADD target/JiaLi-0.0.1-SNAPSHOT.jar /app.jar# 暴露 Spring Boot 應用的端口號 EXPOSE 8088 # 啟動 Spring Boot 應用 CMD ["java", "-jar", "app.jar&q…

前端學習第四天-css提升

達標要求 掌握css復合選擇器 塊級元素和行內元素及行內塊的區別? 哪些元素是塊元素,行內元素及行內塊元素? 熟練掌握display的用法 能夠說出css三大特性 熟練運用背景樣式 1. CSS復合選擇器 復合選擇器是由兩個或多個基礎選擇器&#xff0c;通過不同的方式組合而成的…

vue2結合electron開發跨平臺應用(桌面端應用)

1.確定nodejs和electron的版本號 確定nodejs和electron的版本號及其重要&#xff0c;因為electron的開發版本需要指定的nodejs版本支持。 本文安裝測試使用的是: 1.node18.19.0 2.npm10.2.3 3.vue-cli5.0.8 4.electron29.0.0 2.創建vue2項目 vue create elctron29.0.0_no…

zotero | 多平臺同步 | 堅果云

zotero注冊登陸 打開zotero軟件&#xff0c;mac電腦打開首選項&#xff0c;如下圖所示&#xff1a; 然后點擊同步選項&#xff0c;如下圖所示&#xff0c;如果已經有賬號&#xff0c;請登陸賬號&#xff0c;無則注冊賬號之后再登陸&#xff1b; 注冊堅果云賬號 注冊完堅果…

求最短路徑之BF算法

介紹 全稱Bellman-Ford算法&#xff0c;目的是求解有負權邊的最短路徑問題。 考慮環&#xff0c;根據環中邊的邊權之和的正負&#xff0c;將環分為零環、正環、負環。其中零環、正環不會影響最短路徑的求解&#xff0c;而負環會影響最短路徑的求解。 可用BF算法返回一個bool值…

暗黑大氣MT蘋果CMS MT主題源碼-PC版適用于蘋果CMS V10

蘋果CMS MT主題是一款多功能的主題&#xff0c;適用于蘋果CMS V10的暗黑大氣風格。 地 址 &#xff1a; runruncode.com/houtai/19704.html 初次使用說明&#xff1a; 在后臺設置中&#xff0c;選擇MT主題&#xff0c;并在模板目錄中填寫HTML。 后臺地址為&#xff1a;MT主題…