很容易想到用遞迴,左右子樹的高度差即最大深度差,再寫乙個返回最大深度的函式即可:
執行結果為:
但是這樣的話最壞情況時間複雜度已經達到o(n2)了,主要是每乙個節點都要查詢左右子樹的最大深度,即遞迴呼叫isbalanced()時每乙個isbalanced()函式中都包含兩個完整的maxdepth()的遞迴,所以同乙個節點會被maxdepth呼叫很多次,有重複計算,所以應該針對這一點進行優化。
官方題解中給的方法其實就是乙個標記的思想:
可以看到,如果以某個節點為根節點的樹不是平衡樹,那麼會將深度賦值為-1,再往上的節點也不可能是平衡樹了,深度都為-1。相當於在isbalanced()中返回了root樹的最大深度,只是如果不是平衡樹的話,深度會為-1。所以不需要再遞迴呼叫isbalanced()了,看有沒有標記就夠了,將深度賦值為-1就是起到乙個標記的作用。
此外,在之前的寫法中,最壞情況下,從根節點開始,每乙個節點都要通過maxdepth遍歷一次它所有的子節點,相當於是自頂向下式;而優化後的寫法,只包含乙個完整的maxdepth遞迴,在判斷當前節點之前都已經判斷完了它的子節點,類似後序遍歷,也就是自底向上式,每個節點都只遍歷一遍,所以時間複雜度為o(n)。
執行結果為:
python實現平衡二叉樹 平衡二叉樹python
stack depth is initialised to 0 def find in tree node,find condition,stack depth assert stack depth max stack depth deeper than max depth stack depth ...
leetcode 平衡二叉樹
給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返回 true 給定二叉樹 1,2,2,3,3,null,null,4,4 1 ...
Leetcode 平衡二叉樹
首先是平衡二叉樹的定義,它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。先浮現在腦海中的是分別獲取左右子樹的深度,再對他們的差值進行比較。並且,每乙個子樹也必須是平衡的,因此也需要遞迴去判斷他們。當然最先是特殊情況的處理,當樹為空樹時,它就是平衡的。而在每...