判斷平衡二叉樹

平衡二叉樹(Balanced Binary Tree)具有以下性質:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1。并且左右兩個子樹都是一棵平衡二叉樹

(不是我們平時意義上的必須為搜索樹)

判斷一棵樹是否為平衡二叉樹:

?

可以暴力判斷:每一顆樹是否為平衡二叉樹。

?

分析:

如果左右子樹都已知是平衡二叉樹,而左子樹和右子樹高度差絕對值不超過1,本樹就是平衡的。

?

為此我們需要的信息:左右子樹是否為平衡二叉樹。左右子樹的高度。

?

我們需要給父返回的信息就是:本棵樹是否是平衡的、本棵樹的高度。

?

定義結點和返回值:

	public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value = data;}}
	public static class ReturnType {public int level;   //深度public boolean isB;//本樹是否平衡public ReturnType(int l, boolean is) {level = l;isB = is;}}

我們把代碼寫出來:

	// process(head, 1)public static ReturnType process(Node head, int level) {if (head == null) {return new ReturnType(level, true);}//取信息ReturnType leftSubTreeInfo = process(head.left, level + 1);if(!leftSubTreeInfo.isB) {return new ReturnType(level, false);     //左子樹不是->返回}ReturnType rightSubTreeInfo = process(head.right, level + 1);if(!rightSubTreeInfo.isB) {return new ReturnType(level, false);     //右子樹不是->返回}if (Math.abs(rightSubTreeInfo.level - leftSubTreeInfo.level) > 1) {return new ReturnType(level, false);     //左右高度差大于1->返回}return new ReturnType(Math.max(leftSubTreeInfo.level, rightSubTreeInfo.level), true);//返回高度和true(當前樹是平衡的)}

我們不需要每次都返回高度,用一個全局變量記錄即可。

對于其它二叉樹問題,可能不止一個變量信息,所以,全局記錄最好都養成定義數組的習慣。

下面貼出完整代碼:

import java.util.LinkedList;
import java.util.Queue;public class Demo {public static class Node {public int value;public Node left;public Node right;public Node(int data) {this.value = data;}}public static boolean isBalance(Node head) {boolean[] res = new boolean[1];res[0] = true;getHeight(head, 1, res);return res[0];}public static class ReturnType {public int level;   //深度public boolean isB;//本樹是否平衡public ReturnType(int l, boolean is) {level = l;isB = is;}}// process(head, 1)public static ReturnType process(Node head, int level) {if (head == null) {return new ReturnType(level, true);}//取信息ReturnType leftSubTreeInfo = process(head.left, level + 1);if(!leftSubTreeInfo.isB) {return new ReturnType(level, false);     //左子樹不是->返回}ReturnType rightSubTreeInfo = process(head.right, level + 1);if(!rightSubTreeInfo.isB) {return new ReturnType(level, false);     //右子樹不是->返回}if (Math.abs(rightSubTreeInfo.level - leftSubTreeInfo.level) > 1) {return new ReturnType(level, false);     //左右高度差大于1->返回}return new ReturnType(Math.max(leftSubTreeInfo.level, rightSubTreeInfo.level), true);//返回高度和true(當前樹是平衡的}public static int getHeight(Node head, int level, boolean[] res) {if (head == null) {return level;//返回高度}//取信息//相同邏輯int lH = getHeight(head.left, level + 1, res);if (!res[0]) {return level;}int rH = getHeight(head.right, level + 1, res);if (!res[0]) {return level;}if (Math.abs(lH - rH) > 1) {res[0] = false;}return Math.max(lH, rH);//返回高度}public static void main(String[] args) {Node head = new Node(1);head.left = new Node(2);head.right = new Node(3);head.left.left = new Node(4);head.left.right = new Node(5);head.right.left = new Node(6);head.right.right = new Node(7);System.out.println(isBalance(head));}}

?

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

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

相關文章

劍指offer_02

文章目錄第二章 面試需要的基礎知識1.1 面試官談基礎知識1.2 編程語言1.3 數據結構1.4 算法和數據操作第二章 面試需要的基礎知識 1.1 面試官談基礎知識 數據結構和算法,編程能力,部分數學能力,問題分析和推理能力編程基礎,計算…

求完全二叉樹的結點個數

第一次見這個題,看時間小于O(N)。。。。。 只能是二分啊。 但是怎么二分,條件是什么,真的想不到。 后來知道了,我們要找最深一層最右邊那個結點。借此確定結點個數。 我們知道,滿二叉樹的結點個數和深度是有公式的&a…

劍指offer_03

文章目錄第三章 高質量代碼1.1 面試官談高質量代碼1.2 代碼的規范性1.3 代碼的完整性1.4 代碼的魯棒性第三章 高質量代碼 1.1 面試官談高質量代碼 代碼應該考慮異常狀況和垃圾回收問題,不能忽視邊界情況變量,函數命名應該要統一,備注要恰到…

劍指offer_04

文章目錄第四章 解決面試題的思路1.1 面試官談面試思路1.2 畫圖讓問題抽象化1.3 舉例讓抽象問題具體化1.4 分解讓復雜問題具體化第四章 解決面試題的思路 1.1 面試官談面試思路 編程前講自己的思路是一項考核指標,不能一開始就變成,面試的時候應該和面…

先序中序后序兩兩結合重建二叉樹

遍歷是對樹的一種最基本的運算,所謂遍歷二叉樹,就是按一定的規則和順序走遍二叉樹的所有結點,使每一個結點都被訪問一次,而且只被訪問一次。由于二叉樹是非線性結構,因此,樹的遍歷實質上是將二叉樹的各個結…

劍指offer_05

文章目錄第五章 優化時間和空間效率1.1 面試官談效率1.2 時間效率1.3 時間效率和空間效率的平衡第五章 優化時間和空間效率 1.1 面試官談效率 1.時間和空間復雜度是寫程序的時候,我們需要分析的,最好每次寫完代碼后自己都可以將程序的時間和空間復雜度…

先序中序數組推后序數組

二叉樹遍歷 所謂遍歷(Traversal)是指沿著某條搜索路線,依次對樹中每個結點均做一次且僅做一次訪問。訪問結點所做的操作依賴于具體的應用問 題。 遍歷是二叉樹上最重要的運算之一,是二叉樹上進行其它運算之基礎。 從二叉樹的遞歸定義可知,一…

劍指offer_06

文章目錄第六章 面試中的各項能力1.1 面試官談能力1.2 溝通能力和學習能力1.3 知識遷移能力1.4 抽象建模能力1.5 發散思維能力第六章 面試中的各項能力 1.1 面試官談能力 1.禮貌平和,不卑不亢的和面試官溝通;邏輯清楚,詳略得到的介紹項目經…

數據結構課上筆記11

滿二叉樹 (Full binary tree) 除最后一層無任何子節點外,每一層上的所有結點都有兩個子結點二叉樹。 國內教程定義:一個二叉樹,如果每一個層的結點數都達到最大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹…

數據結構和算法(01)--- 算法復雜度

文章目錄算法時間復雜度算法時間復雜度 要判斷算法的好壞,可以從時間方面進行分析。算法運行的越快,所用的時間越短則算法越好。但是同一個算法在不同的平臺上的運行時間不同。那么又該如何進行評判呢?我們采用時間復雜度進行衡量。 1.算法時…

數據結構課上筆記12

二叉樹的存儲結構 順序存儲結構 完全二叉樹:用一組地址連續的 存儲單元依次自上而下、自左至右存 儲結點元素,即將編號為 i 的結點元 素存儲在一維數組中下標為 i –1 的分量中。 一般二叉樹:將其每個結點與完 全二叉樹上的結點相對照&…

kaggle(01)-泰坦尼克號問題

經典又兼具備趣味性的Kaggle案例泰坦尼克號問題 大家都熟悉的『Jack and Rose』的故事,豪華游艇倒了,大家都驚恐逃生,可是救生艇的數量有限,無法人人都有,副船長發話了『lady and kid first!』&#xff0c…

數據結構課上筆記13

樹存儲結構 父節點表示法 數據域:存放結點本身信息。 雙親域:指示本結點的雙親結點在數組中的位置。 對應的樹: /* 樹節點的定義 */ #define MAX_TREE_SIZE 100typedef struct{TElemType data;int parent; /* 父節點位置域 */ } PTNode;type…

數據結構課上筆記14

圖是一種: 數據元素間存在多對多關系的數據結構 加上一組基本操作構成的抽象數據類型。 圖 (Graph) 是一種復雜的非線性數據結構,由頂點集合及頂點間的關系(也稱弧或邊)集合組成。可以表示為: G=(V, V…

kaggle(03)-自行車租賃預測問題(基礎版)

文章目錄問題描述:問題解決分析問題:解決問題第一步:讀取原始數據第二步:觀察原始數據第三步:原始數據的可視化第四步:數據的預處理時間屬性的分解第五步:數據的特征提取特征生成特征選擇第六步…

二叉樹序列化/反序列化

二叉樹被記錄成文件的過程,為二叉樹的序列化 通過文件重新建立原來的二叉樹的過程,為二叉樹的反序列化 設計方案并實現。 (已知結點類型為32位整型) 思路:先序遍歷實現。 因為要寫入文件,我們要把二叉樹…

機器學習總結(17)-XGBoost

文章目錄lecture17:XGBoost(eXtreme Gradient Boosting)目錄1. XGBoost的基本信息2. XGBoost與GBDT的異同點3. XGBoost的原理3.1定義樹的復雜度3.2 分裂節點3.3 自定義損失函數4. XGBoost的使用lecture17:XGBoost(eXtreme Gradient Boosting) 目錄 1. …

C++基礎學習(01)--(介紹,環境配置,基本語法,注釋)

文章目錄目錄一. c介紹二. c開發環境到的配置三. c基本語法四. c注釋目錄 一. c介紹 C 是一種靜態類型的、編譯式的、通用的、大小寫敏感的、不規則的編程語言,支持過程化編程、面向對象編程和泛型編程。 C 被認為是一種中級語言,它綜合了高級語言和低…

《Head First設計模式》讀書筆記_第一章

策略模式 例:設計一個模擬鴨子游戲,游戲中有各種鴨子,一邊戲水一邊嘎嘎叫。 所以學習設計模式前,我們最先想到的就是設置一個超類,并讓其他子類去繼承這個類,UML圖如下: * * 但是&#xff0…

根據數組建立平衡二叉搜索樹

它是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,并且左右兩個子樹都是一棵平衡二叉(搜索)樹。 二分:用有序數組中中間的數生成搜索二叉樹的頭節點,然后對數組的左右部分分別生成左右子樹即可(重復…