解題筆記(20)——判斷二叉樹是不是平衡的
思路:對於樹的題目,第一反應就是用遞迴。對於以某個結點為根的樹,只需計算出它的左右子樹的深度,如果深度相差小於等於1,則遞迴判斷它的左右子樹是不是平衡樹;否則肯定不是平衡二叉樹。這個問題的關鍵是要計算樹的深度,如果是自頂向下,會有很多重複的計算。計算以1為根的樹的深度,會牽涉到以2為根、以3為根的子樹。計算以2為根的樹的深度,會牽涉到以4為根、以5為根的子樹。由於要遍歷每個結點,判斷以該結點為根的樹是不是平衡二叉樹。所以計算以1為根的樹的深度,與計算以2為根的樹的深度,會重複計算以4為根、以5為根的子樹的深度。
消除重複辦法,當時是能記錄下之前計算過的子樹的深度,下次使用就不用重新計算。這就需要自底向上的計算深度。慶幸的是遞迴解決樹的問題,就是自底向上的過程。因為我們在遞迴求解中,先要得出子樹的解,子樹的解最終會轉換為葉結點的解。可以利用後序遍歷的方法,遍歷每個結點時,先判斷它的左右子樹是不是平衡二叉樹,同時記錄下左右子樹的深度,然後判斷該結點為根的樹是不是平衡二叉樹,至於該樹的深度計算很方便,取左右子樹中較大的深度+1就可以了。這裡左右子樹的深度在遞迴求解中已經計算出來,不需要重複計算了。
參考程式碼:
struct BinaryTreeNode { int data; BinaryTreeNode *pLeft; BinaryTreeNode *pRight; }; //函式功能 : 判斷二叉樹是不是平衡的 //函式引數 : pRoot為根結點,pDepth為根結點的深度。 //返回值 : 是否平衡的 bool IsBalanced(BinaryTreeNode *pRoot, int *pDepth) { if(pRoot == NULL) { *pDepth = 0; return true; } int leftDepth, rightDepth; //左右子樹的深度 if(IsBalanced(pRoot->pLeft, &leftDepth)&& IsBalanced(pRoot->pRight, &rightDepth)) { int diff = leftDepth - rightDepth; if(diff == 0 || diff == 1 || diff == -1) //相差為0或1或-1 { *pDepth = 1 + (leftDepth > rightDepth ? leftDepth: rightDepth); return true; } else return false; } return false; }
相關推薦
解題筆記(20)——判斷二叉樹是不是平衡的
問題描述:輸入一棵二叉樹的根結點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。例如下圖中的二叉樹就是一棵平衡二叉樹: 思路:對於樹的題目,第一反應就是用遞迴。對於以某個結點
解題報告——(shuiti)對稱二叉樹
文章目錄 題目 對稱二叉樹 題目描述 思路 檢查是否符合對稱條件 信仰深搜 找答案 另外 code 總結 題目 對稱二叉樹 題目描述 題
判斷二叉樹是否平衡(letcodeC語言)
給定一個二叉樹,判斷它是否是高度平衡的二叉樹。 本題中,一棵高度平衡二叉樹定義為: 一個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。 示例 1: 給定二叉樹 [3,9,20,null,null,15,7] 3 / \ 9
二叉樹(11)----求二叉樹的鏡像,遞歸和非遞歸方式
temp right 二叉樹 -a data nbsp rac art urn 1、二叉樹定義: typedef struct BTreeNodeElement_t_ { void *data; } BTreeNodeElement_t; type
牛客(4) 重建二叉樹
start str art stat ring 例如 class 前序 數字 //題目描述// 輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。// 假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。// 例如輸入前序
牛客66題(4)重建二叉樹
輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 /** * Definition for binary
劍指offer——(8)重建二叉樹&&二叉樹的深度
/** * Definition for binary tree * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x)
資料結構(四)之二叉樹
二叉樹 二叉樹可以用陣列和鏈式結構這兩種方式來建立,這裡只介紹二叉樹的鏈式結構,並且實現二叉樹的前序、中序和後序遍歷。(運用二叉樹組定義靜態二叉樹的方式以註釋的形式寫明) 二叉樹的建立有三種方式:前序、中序和後序。這裡只展現了前序遍歷的方式。 #include<
面試題55(一):二叉樹的深度
一、題目 輸入一棵二叉樹的根結點,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度為樹的深度。 二、關鍵 三、解釋 四、程式碼 #include <cstdio> #include "..\Utilities\
C#算法系列(2)——線索二叉樹
首先在這裡宣告一下,本篇部落格參考另外一位大神的部落格,部落格連結如下:http://blog.csdn.net/UncleMing5371/article/details/54176252。由於寫的很好理解,所以就拿來借鑑一下,主要目的也是出於學
自定義樹(1):二叉樹
通過學習自定義樹,瞭解與樹相關的資料結構。 1)樹:n(n>=0)個結點的有限集。 結點的度:結點擁有的子樹的數目 葉子結點(終端結點):度為0的結點 分支結點(非終端結點):度不為0的結點 樹的度:樹中各結點的度的最大值 層次:根結點的層次
多叉樹(森林)轉二叉樹
本來不怎麼想寫這個,但發現網上的都是“殘疾”部落格,講得不是很詳細,所以我還是要寫一下。 多叉轉二叉有“左兒子右兄弟”的說法,然而對於什麼都不知道的小白,這句話沒有任何用…… 思路 大體就兩步,很好理解,如圖是用來舉慄的多叉樹: 兄弟連 將
(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。 (4)求二叉樹的所有葉子及結點總數。
(1)建立二叉樹的二叉連結串列。 (2)寫出對用二叉連結串列儲存的二叉樹進行先序、中序和後序遍歷的遞迴和非遞迴演算法。 (3)寫出對用二叉連結串列儲存的二叉樹進行層次遍歷演算法。(4)求二叉樹的所有葉子及結點總數。 include<stdio.h> #inclu
(原創)線索二叉樹那點小破事
rar 並且 抽象 頭結點 nbsp 樹的遍歷 ros 區別 怎麽 線索二叉樹 二叉樹的基本定義結構我們都很熟悉,節點數據加上孩紙指針,左孩子指娘家,右孩子指婆家,我們來看這個例子: 我們會發現,有些孩子並沒有地方可以去,例子中的樹一共十個結點,十一個空閑指針,由此
層次遍歷:判斷二叉樹是否平衡
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。 求每個節點左右子樹深度,絕對差大於1則不是。 class Solution { public: int count=0; int depth=0; bool IsBalanced_So
演算法題(三十二):判斷二叉樹是否是平衡二叉樹
7. 判斷是否是BST 題目描述 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。 分析 可以用遞迴的方法,從下向上遍歷各個結點(後序遍歷),如果結點是滿足BST的條件則返回該結點的高度,如果不滿足則直接停止遍歷並返回false。 程式碼 public cl
判斷二叉樹是否相等(leetcode-100)
遞迴依據:兩棵樹相同位置節點的子樹也必須相等 遞迴出口:兩個節點全是None,相等;只有一個是None,不等;兩個都不是None,但節點值不相等,不等。 # Definition for a bi
劍指offer:判斷二叉樹是不是平衡二叉樹(java)
題目:輸入一棵二叉樹的根節點,判斷該樹是不是平衡的二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。 有了求二叉樹的深度的經驗之後再解決這個問題,我們很容易就能想到一個思路:在遍歷樹的每個結點的時候,呼叫函式TreeDepth得到
【LeetCode題目記錄-11】判斷二叉樹是否是映象的(對稱的)
Symmetric Tree Given a binary tree, check whether it is a mirror of itself (ie, symmetric around it
101. Symmetric Tree (判斷二叉樹是否對稱)
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center). For example, this binary tree [1,2,2,3,4