Swift-判斷二叉樹是否為平衡二叉樹

題目:輸入一棵二叉樹的根結(jié)點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意結(jié)點的左右子樹的深度相差不超過1,那么它就是一棵平衡二叉樹。例如,下圖中的二叉樹就是一棵平衡二叉樹.


二叉平衡樹.jpg

最簡單的解法是遍歷每個節(jié)點左右節(jié)點深度,進行對比:
<pre><code>`
func isBalanceTree(rootNode:TreeNode?) -> Bool {
if rootNode == nil {
return true
}
let leftDepth:Int = treeMaxDepth(rootNode: rootNode?.leftChild)
let rightDepth:Int = treeMaxDepth(rootNode: rootNode?.rightChild)

    let diff:Int = leftDepth - rightDepth
    if diff > 1 || diff < -1 {
        return false
    }
    return isBalanceTree(rootNode: rootNode?.leftChild) && isBalanceTree(rootNode: rootNode?.rightChild)
}
`</code></pre>

上述解法不夠高效,我們可以每次遍歷的時候記錄一下深度:
<pre><code>`

func isBalanceTreeOnce(rootNode:TreeNode?,depth:inout Int) -> Bool {
    if rootNode == nil {
        depth = 0
        return true
    }
    var leftDepth:Int = 0
    var rightDepth:Int = 0
    if isBalanceTreeOnce(rootNode: rootNode?.leftChild, depth: &leftDepth) && isBalanceTreeOnce(rootNode: rootNode?.rightChild, depth: &rightDepth) {
        let diff:Int = leftDepth - rightDepth
        if diff <= 1 && diff >= -1 {
            depth = leftDepth > rightDepth ? leftDepth + 1 : rightDepth + 1
            return true
        }
    }
    return false
}

func isBalancedTree(rootNode:TreeNode?) -> Bool {
    var depth:Int = 0
    return isBalanceTreeOnce(rootNode: rootNode, depth: &depth)
}`</code></pre>

測試代碼:
<pre><code>`
var isBalance:Bool = binaryTreePath.isBalanceTree(rootNode: preRootNode)
print("FlyElephant-(depthData)二叉平衡樹--(isBalance)")

var isBalance2:Bool = binaryTreePath.isBalancedTree(rootNode: preRootNode)
print("FlyElephant-(depthData)二叉平衡樹--(isBalance2)")`</code></pre>

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

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

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹與前面介紹的線性表,棧,隊列等線性結(jié)構(gòu)不同,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,781評論 1 31
  • 四、樹與二叉樹 1. 二叉樹的順序存儲結(jié)構(gòu) 二叉樹的順序存儲就是用數(shù)組存儲二叉樹。二叉樹的每個結(jié)點在順序存儲中都有...
    MinoyJet閱讀 1,753評論 0 7
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個結(jié)點至多有m個孩子。 除根結(jié)點和葉子結(jié)點外,其它每個結(jié)點至少有m...
    文檔隨手記閱讀 13,697評論 0 25
  • 0. 什么是樹 數(shù)據(jù)的基本單位是數(shù)據(jù)元素,在涉及到數(shù)據(jù)處理時數(shù)據(jù)元素之間的關(guān)系稱之為結(jié)構(gòu),我們依據(jù)數(shù)據(jù)元素之間關(guān)系...
    安安zoe閱讀 545評論 0 0
  • 數(shù)據(jù)結(jié)構(gòu)與算法--從平衡二叉樹(AVL)到紅黑樹 上節(jié)學習了二叉查找樹。算法的性能取決于樹的形狀,而樹的形狀取決于...
    sunhaiyu閱讀 7,815評論 4 32

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