LeetCode 110. 平衡二叉樹思考分析

題目

給定一個二叉樹,判斷它是否是高度平衡的二叉樹。
本題中,一棵高度平衡二叉樹定義為:
一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。
示例 1:
給定二叉樹 [3,9,20,null,null,15,7]
3
/
9 20
/
15 7
返回 true 。
示例 2:
給定二叉樹 [1,2,2,3,3,null,null,4,4]
1
/
2 2
/
3 3
/
4 4
返回 false 。

思路一:遞歸記錄每個結點的高度+層序遍歷檢查高度差

不過這樣的效率較低,畢竟遍歷了兩遍。

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int getDepth(TreeNode* node){if(node == NULL) return 0;int left=getDepth(node->left);int right=getDepth(node->right);node->val = max(left,right)+1;return max(left,right)+1;}bool isBalanced(TreeNode* root) {getDepth(root);queue<TreeNode*> que;if(root!=NULL) que.push(root);int num=0;while(!que.empty()){//該層結點元素個數 = 該層隊列元素int size = que.size();//這里要使用固定大小的size,不能使用que.size(),因為在處理中que.size是不斷變化的//將這層元素送入隊列中并依次從隊首向隊尾將元素出隊列,每個元素出隊列的同時又將其不為空的子結點送入隊列for(int i =0;i<size;i++){TreeNode* node = que.front();//將隊首元素送入該層結果que.pop();if(node->left && node->right){if(abs(node->left->val - node->right->val)>1){return false;}}if(node->left && !node->right){if(node->left->val>1){return false;}}if(!node->left && node->right){if(node->right->val>1){return false;}}//將左右孩子結點入隊列,作為下一層的元素if(node->left) que.push(node->left);if(node->right) que.push(node->right);}}return true;}
};

在這里插入圖片描述

參考其他思路

概念辨析:
二叉樹結點的深度:指從根結點到該結點的最長簡單路徑邊的條數
二叉樹結點的高度:指從該結點到葉結點的最長簡單路徑邊的條數
leetcode中強調的深度和高度很明顯是按照結點來計算。
深度是從上到下去查,所以需要前序遍歷(中左右),而高度只能從下到上去查,所以只能使用后序遍歷(左右中)。
根結點的最大深度就是這個根結點的高度。
遞歸三部曲分析:
1、確定遞歸參數和返回值
參數:傳入的結點指針
返回值:返回傳入結點為根結點的樹的高度。
如果已經不是二叉平衡樹了可以返回-1進行標記。

//-1 表示已經不是平衡二叉樹了,否則返回值就是以該節點為更急誒·根結點的樹的高度(最大深度)
int getDepth(TreeNode* node)

2、明確終止條件
遇到空結點終止,返回0

if(node ==NULL) return 0 ;

3、明確單層邏輯

1、如果左子樹不是平衡二叉樹,返回-1
2、如果右子樹不是平衡二叉樹,返回-1
3、如果左右子樹的高度差大于1,返回-1
4、否則,返回結點高度

int leftDepth = getDepth(node->left);
if(leftDepth == -1) return -1;
int rightDepth= getDepth(node->right);
if(rightDepth== -1) return -1;
if(abs(leftDepth - rightDepth)>1) return -1;
else return 1+max(leftDepth,rightDepth);

4、完整遞歸代碼

int getDepth(TreeNode* node)
{if(node ==NULL) return 0 ;int leftDepth = getDepth(node->left);if(leftDepth == -1) return -1;int rightDepth= getDepth(node->right);if(rightDepth== -1) return -1;if(abs(leftDepth - rightDepth)>1) return -1;else return 1+max(leftDepth,rightDepth);
}

5、舉例分析
在這里插入圖片描述
以左側為例:
4:高度為 1
3:高度為 2
2:高度為3,它的左子樹高度為2,右子樹高度為0,高度差大于1,所以非平衡樹。
下面是我寫的錯誤的代碼,原因是對平衡二叉樹的理解出現了差錯,是兩個子樹的高度差大于1。
而且考慮到出現一次非平衡狀態就直接返回-1,一直返回到原結點,從而減少時間浪費。

錯誤代碼:
int getDepth(TreeNode* node) { if(node == NULL) return 0; int left=getDepth(node->left); int right=getDepth(node->right); if(node->left && node->right) { if(abs(left-right)>1) { return -1; } } if(node->left && !node->right) { if(left>1) { return -1; } } if(!node->left && node->right) { if(right>1) { return -1; } } return max(left,right)+1; }
AC代碼:

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode() : val(0), left(nullptr), right(nullptr) {}*     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}*     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}* };*/
class Solution {
public:int getDepth(TreeNode* node){if(node ==NULL) return 0 ;int leftDepth = getDepth(node->left);if(leftDepth == -1) return -1;int rightDepth= getDepth(node->right);if(rightDepth== -1) return -1;if(abs(leftDepth - rightDepth)>1) return -1;else return 1+max(leftDepth,rightDepth);}bool isBalanced(TreeNode* root) {if(getDepth(root)==-1) return false;return true;}
};

在這里插入圖片描述

總結

了解了二叉樹的深度與高度的差異,求深度適合用前序遍歷,求高度適合用后序遍歷。

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

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

相關文章

Redhat配置XDMCP及相關linux命令

為了能夠使用 Xwin32 或 Xmanager 登錄到 Linux 主機所進行的配置。需要首先在linux上進行相關配置 1.“系統”菜單中選擇“管理”下的“登錄屏幕” 2.出現“登錄窗口首選項”窗口。選擇“遠程”選項卡&#xff0c;將“樣式”改為:“與本地相同” 3.選擇“安全”選項卡&#xf…

充實的日子里忙忙碌碌

實習已經有一個多月了&#xff0c;話說這個月發工資就有我的份兒了&#xff0c;哇咔咔~~~感覺忙忙碌碌的生活其實很充實的。工作日每天都是7點10分左右起來&#xff0c;8點半到公司買早飯吃東西&#xff0c;9點上班開工。先羅列要干的東西&#xff0c;然后一項一項完成&#xf…

十三、圖像梯度

一、兩種算子 一階導數—Sobel算子 水平梯度&#xff1a; 垂直梯度&#xff1a; 最終圖像梯度&#xff1a; 二階導數—Laplacian算子 在二階導數的時候&#xff0c;最大變化處的值為零&#xff0c;即邊緣是零值。 常見的拉普拉斯算子&#xff1a;、其所有元素之和為零。…

Java Formatter out()方法與示例

格式化程序類out()方法 (Formatter Class out() method) out() method is available in java.util package. out()方法在java.util包中可用。 out() method is used to get Appendable for the output. out()方法用于獲取輸出的Appendable。 out() method is a non-static meth…

SQL2008,SQL2005存儲過程解密

SQL2008,SQL2005存儲過程解密 下載&#xff1a;附件 SQL2008,SQL2005存儲過程解密第一步操作步驟&#xff1a;程序->Sql Server2005-> 配置工具-> Sql Server 外圍應用配置器-> 功能的外圍應用配置器-> DataBase Engine-> DAC -> 啟用遠程DAC 第二步&a…

LeetCode 257. 二叉樹的所有路徑 思考分析

目錄題目思路一&#xff1a;深度遞歸思路二&#xff1a;廣度迭代關于回溯題目 給定一個二叉樹&#xff0c;返回所有從根節點到葉子節點的路徑。 說明: 葉子節點是指沒有子節點的節點。 示例: 輸入: 輸出: [“1->2->5”, “1->3”] 解釋: 所有根節點到葉子節點的路…

自定義django的Template context processors

簡要步驟&#xff1a; 1.編輯一個函數: def media_url(request):from django.conf import settingsreturn {media_url: settings.MEDIA_URL}2.配置settings&#xff1a; TEMPLATE_CONTEXT_PROCESSORS (myapp.context_processors.media_url,) 3.確保幾點&#xff1a; 1&#xf…

十四、Canny邊緣提取

一、算法步驟 1&#xff0c;對圖像進行GaussianBlur(高斯模糊)消除一些噪聲 2&#xff0c;對圖像進行灰度轉換cvtColor 3&#xff0c;計算梯度Sobel/Scharr 4&#xff0c;非最大信號抑制 5&#xff0c;高低閾值輸出二值圖像 設定兩個閾值T1和T2&#xff0c;凡是高于T2的都保…

scanner close_Java Scanner close()方法與示例

scanner close掃描器類close()方法 (Scanner Class close() method) close() method is available in java.util package. close()方法在java.util包中可用。 close() method is used to close this Scanner object when opened otherwise this method does not affect. 當打開…

flex3.0中打包的方法swc

flex3.0中打包的方法&#xff1a; 1. 新建一個 flex library project 2. 彈出的對話框 點 next ,在Classes下&#xff0c;找到Main source folder 點瀏覽 3. 選擇你新建的文件夾 點 new 然后點擊 OK 4. 這個時候 Classes 下多了個src 文件夾&#xff0c;打開源文件夾&#xf…

Java Hashtable get()方法與示例

哈希表類的get()方法 (Hashtable Class get() method) get() method is available in java.util package. get()方法在java.util包中可用。 get() method is used to return the value associated with the given key element (key_ele) in this Hashtable. get()方法用于返回與…

圖解PCB布線數字地、模擬地、電源地,單點接地抗干擾!

我們在進行pcb布線時總會面臨一塊板上有兩種、三種地的情況&#xff0c;傻瓜式的做法當然是不管三七二十一&#xff0c;只要是地 就整塊敷銅了。這種對于低速板或者對干擾不敏感的板子來講還是沒問題的&#xff0c;否則可能導致板子就沒法正常工作了。當然若碰到一塊板子上有多…

十五、霍夫直線檢測

一、自定義 import cv2 import numpy as np from matplotlib import pyplot as pltdef line_detection(image):gray cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)edges cv2.Canny(gray,50,150,apertureSize3)lines cv2.HoughLines(edges,1,np.pi/180,200)for line in lines:rho…

xred520

Option ExplicitResponse.BufferTrueServer.ScriptTimeOut90 腳本超時時間(單位:秒)Session.Timeout60 Session過期時間(單位:分鐘)Response.Expires-1 Sub DataConn() On Error Resume Next Dim strConn If isSQL0 Then ACCESS數據庫 If EnableDataBaseCache 1 Then ACCESS數…

【C++ grammar】對象指針、對象數組、函數參數

目錄1、Object Pointer & Dynamic Object1. Accessing Object Members via Pointers2. Creating Dynamic Objects on Heap2、Array of Objects聲明方式3、Passing Objects to Functions1、Objects as Function Arguments (對象作為函數參數)2. Objects as Function Return …

Java Date toString()方法與示例

日期類toString()方法 (Date Class toString() method) toString() method is available in java.util package. toString()方法在java.util包中可用。 toString() method is for string denotation of this Date object or in other words we can say it denotes date in a st…

十六、霍夫圓形檢測

一、獲取圓形檢測原理 原圖如下&#xff1a; 選取一個圓的任意點設定為圓形進行繪制圓形&#xff0c;交與一點 再將平面直角坐標系上的各點&#xff0c;通過公式轉到極坐標上 很明顯的看出較亮的點為圓心&#xff0c;然后通過半徑進行繪制出圓。 二、實現步驟 由于霍夫圓檢…

商務智能與交易系統的區別

商務智能與交易系統的區別 1、系統設計的區別 商務智能與交易系統之間的差異主要體現在系統設計和數據類型上&#xff08;見表 1.1 和表1.2&#xff09;。交易系統把結構強加于商務之上&#xff0c;不管誰來進行一項交易活動&#xff0c; 都會遵循同樣的程序和規則&#xff0c;…

LeetCode 572. 另一個樹的子樹 思考分析

題目 給定兩個非空二叉樹 s 和 t&#xff0c;檢驗 s 中是否包含和 t 具有相同結構和節點值的子樹。s 的一個子樹包括 s 的一個節點和這個節點的所有子孫。s 也可以看做它自身的一棵子樹。 示例 1: 給定的樹 s: 示例 2: 給定的樹 s: 思路 思路&#xff1a;首先層序遍歷s樹…

2013.8.7Java語言基礎——數組

數組是數據類型一致的變量的集合。 一個&#xff1a;變量 一堆&#xff08;多個&#xff09;&#xff1a;數組 數組語法&#xff1a; 1&#xff09;數組變量&#xff08;引用類型變量&#xff09; 數組變量通過引用地址引用了數組&#xff08;數組對象&#xff09; 2&#xff0…