1. 程式人生 > >平衡二叉樹的判斷

平衡二叉樹的判斷

文章目錄

平衡二叉樹的判斷

二叉樹是比較常見的樹,而且樹的平衡具有非常重要的特性。如果一顆搜尋二叉樹的平衡性不是很好,那麼搜尋的效率就不會很高了。

開門題

前幾天考研,今年人大計科的程式設計題就是判斷一棵樹是否為平衡二叉樹。所以就先拿這個題熱熱身。

問題

既然要判斷一棵樹是否為平衡二叉樹,那麼久需要先理解什麼是平衡樹。

  • 空樹是一顆平衡樹
  • 非空樹中任意一個節點的左子樹和右子樹的高度差不大於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。微信公眾號:後臺技術棧。
image