LeetCode 110.平衡二叉樹 python/scala

Balanced Binary Tree

環(huán)境:python 3.6,scala 2.11.8

題意

判斷一個(gè)二叉樹是否為高度平衡的二叉樹。

一棵高度平衡二叉樹定義為:一個(gè)二叉樹每個(gè)節(jié)點(diǎn)的左右兩個(gè)子樹的高度差的絕對(duì)值不超過 1。

分析

高度平衡的二叉樹,要求左右兩個(gè)子樹的高度差的絕對(duì)值不超過 1。如果能求得樹的深度,才可方便比較左右子樹的高度差。

因此,該題需要理解掌握LC104-二叉樹的最大深度。思路重點(diǎn)是,在遍歷過程中,求每個(gè)左右節(jié)點(diǎn)的最大深度,進(jìn)行比較;

有兩種實(shí)現(xiàn)方法,區(qū)別在于第一種方法是由LC104計(jì)算絕對(duì)深度進(jìn)行比較,而第二種方法則關(guān)注于全局變量和及時(shí)返回的處理上。

代碼

python

def isBalanced(root):
    """
    :type root: TreeNode
    :rtype: bool
    """
    if not root: return True
    left, right = maxDepthV2(root.left), maxDepthV2(root.right)    # 這里引用 lc104 的 maxDepthV2
    return abs(left - right) <= 1 and isBalanced(root.left) and isBalanced(root.right)


def isBalancedV2(root):
    if not root: return True
    rs = [1]

    def dfs(node):
        if not node or not rs[-1]: return 0
        left, right = dfs(node.left), dfs(node.right)
        if abs(left - right) > 1:
            rs[-1] = 0
            return 0
        return 1 + max(left, right)
    dfs(root)
    return bool(rs[-1])

scala

object LC110 {
  def isBalanced(root: TreeNode): Boolean = {
    if (root == null) return true
    val (left, right) = (maxDepthV2(root.left), maxDepthV2(root.right)) // # 這里引用 lc104 的 maxDepthV2
    math.abs(left - right) <= 1 & isBalanced(root.left) & isBalanced(root.right)
  }

  def isBalancedV2(root: TreeNode): Boolean = {
    if (root == null) return true

    var rs = true

    def dfs(node: TreeNode): Int = {
      if (node == null | !rs) return 0
      val (left, right) = (dfs(node.left), dfs(node.right))
      if (math.abs(left - right) > 1) {
        rs = false
        0
      } else {
        1 + math.max(left, right)
      }
    }

    dfs(root)

    rs
  }

  // isBalancedV2 另一種寫法
  def isBalancedV3(root: TreeNode): Boolean = {
    var balance = true

    def go(node: TreeNode): Int = node match {
      case null => 0
      case _ if !balance => 0
      case _ => {
        val (left, right) = (go(node.left), go(node.right))
        if (math.abs(left - right) <= 1) 1 + math.max(left, right)
        else {balance = false; 0}
      }
    }
    go(root)
    balance
  }
}

最后

歡迎交流和補(bǔ)充

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容