平衡二叉樹的判斷
阿新 • • 發佈:2019-01-07
文章目錄
平衡二叉樹的判斷
二叉樹是比較常見的樹,而且樹的平衡具有非常重要的特性。如果一顆搜尋二叉樹的平衡性不是很好,那麼搜尋的效率就不會很高了。
開門題
前幾天考研,今年人大計科的程式設計題就是判斷一棵樹是否為平衡二叉樹。所以就先拿這個題熱熱身。
問題
既然要判斷一棵樹是否為平衡二叉樹,那麼久需要先理解什麼是平衡樹。
- 空樹是一顆平衡樹
- 非空樹中任意一個節點的左子樹和右子樹的高度差不大於1
思路
直接根據定義入手, 最簡單的實現就是使用遞迴。既然需要統計樹的高度,那麼會有一個函式統計樹的高度。
實現
樹的結構定義如下:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
樹的高度
遞迴公式如下:
- 空樹:返回0
- 非空樹:max(左子樹高度,右子樹高度)+1
func height(root *TreeNode) int { if root == nil { return 0 } lh := height(root.Left) rh := height(root.Right) largest := lh if rh > lh { largest = rh } largest++ return largest }
平衡性的判斷
遞迴公式:
- 空樹:返回true
- 非空樹
- 以當前節點為根節點的樹不平衡:返回false
- 以當前節點為根節點的樹平衡:遞迴的判斷左子樹和右子樹是否平衡
func isBalanced(root *TreeNode) bool { if root == nil { return true } lh := height(root.Left) rh := height(root.Right) diff := lh - rh if diff < -1 || diff > 1 { return false } return isBalanced(root.Left) && isBalanced(root.Right) }
關於作者
大四學生一枚,分析資料結構,面試題,golang,C語言等知識。QQ交流群:521625004。微信公眾號:後臺技術棧。