劍指 Offer 55 II 平衡二叉樹

2021-10-25 02:47:27 字數 1831 閱讀 7751

輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。

示例 1:

給定二叉樹 [3,9,20,null,null,15,7]3/

9 20

/ 15 7

返回 true 。

示例 2:

給定二叉樹 [1,2,2,3,3,null,null,4,4]

1

/ \2 2

/ \

3 3

/ 4 4

返回 false 。

限制:1 <= 樹的結點個數 <= 10000

執行未通過的乙個思路

樹相關問題-遞迴

從根節點向下進入左右子樹ab

ab若存在子節點,繼續向下遞迴,遞迴一次深度加一

取左右子樹深度相減的絕對值作為評判是否平衡的標準

上述思路存在的問題:

上述的深度與樹的高度並不相同,乙個節點的高度是左右子樹高度的較大值加一,從下向上計算,而深度是從上向下計算,空節點的深度不為0

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

int depth =0;

public

intgetdepth

(treenode node)

}}

乙個節點n的高度可以由下式計算

h = 0, 此節點左右子樹都為空

h = math.max(h(n.left), h(n.right)) + 1 ,高度為左右子樹最大的高度加一

1.自頂向下遞迴

對於每一層,最上層需要遍歷所有節點n,接下來是(n - 1)/ 2 * 2, 直到最後一層,也就是各層執行getheight()的時間複雜度為n, 二叉樹最好情況下(滿樹)層數為logn,最壞情況下(鏈式)層數為n

總時間複雜度最好為nlogn,最壞為n2

空間:n, 棧的深度取決於遞迴的層數,不超過n

/**

* definition for a binary tree node.

* public class treenode

* }*/class

solution

public

intgetheight

(treenode node)

}

2.自底向上遞迴(最優)

自頂向下的方法存在重複計算:getheight被重複呼叫

獲得高度和判斷平衡可以放在一起

對於當前節點,先遞迴的判斷其左右子樹是否平衡,再判斷以這個節點是否平衡

如果一顆子樹平衡,那麼返回其高度,否則返回 - 1

子樹不平衡整個樹就不平衡

若左子樹不平衡直接返回 -1,不需要再次遞迴檢查右子樹

/**

* definition for a binary tree node.

* public class treenode

* treenode(int val)

* treenode(int val, treenode left, treenode right)

* }*/class

solution

public

intgetheight

(treenode root)

}

劍指offer 55 II 平衡二叉樹

題目鏈結 輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。示例 1 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返回 true 示例 2 給定二叉樹 1,2,2,3,3,null,nu...

劍指offer55 II 平衡二叉樹

題目 輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。分析 平衡二叉樹 balance tree 的定義是 二叉樹中任意節點的左右子樹的深度相差不超過1。注意是任意節點,並不只是根節點的 左深度 右深度 還有其子樹也必須是平衡二叉樹。從該定義也可知是利用遞迴來解決這個問題。class soluti...

劍指 Offer 55 II 平衡二叉樹

輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹 二叉樹中任意節點的左右子樹的深度相差不超過1,則是平衡二叉樹 回顧遞迴求深度的方案,是先求得左右子樹的深度,然後進一步得到當前節點的深度,即先左右子樹,再根節點 可以直接加入乙個全域性變數記錄當前是否平衡,並額外引入乙個邏輯來比較子樹的深度 bfs迭...