Leetcode平衡二叉樹演算法與分析

2021-09-28 01:41:54 字數 1528 閱讀 9264

@leetcode平衡二叉樹

樹型別的典型題之一,廢話少說,直接來題幹:

給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。

本題中,一棵高度平衡二叉樹定義為:

乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。

示例 1:

給定二叉樹 [3,9,20,null,null,15,7]返回true。

示例 2:

給定二叉樹 [1,2,2,3,3,null,null,4,4]返回false。

題幹並不複雜,甚至大家一眼就可以看出true和false的區別:樹的左右子樹的高度明顯不同。但是本題繞了個小彎,這需要你十分清楚平衡二叉樹的定義,才能一眼發現解題的破綻。筆者很菜,花了不少時間才發現了這個問題,並且還在如何判斷每個子結點的子樹高度上「紅橙做伴」了許久才得出乙份潦草的**:

相信每位code都有嘗試各種不同的遞迴思路,筆者也不例外,現在看到這的你,是否也出現了下面tle的問題:

如果你也遇到了這個問題,那麼很可能你的遞迴判斷是分了左右子樹分別判斷高度並最終返回其中最高的數值再在主函式中進行比較,不得不說,這個方法,確實會超出時間限制,筆者親測不成功,請大家另闢蹊徑。

那麼筆者通過的思路是什麼呢?仍然是遞迴,只不過這一次直接返回了整棵樹是否滿足要求,避免了很多的二次判斷,即使如此筆者還是在主函式中加上了一些基礎的判斷以解決空樹和樹中只有乙個根結點這兩種特殊情況。

具體的思路在judgeheight這個函式裡面,只需比較左子樹高度和右子樹高度差值的絕對值是否超過2,只要不超過,高度便可定為兩者較大值加1(本層滿足),否則返回-1。這個-1的返回要一層層往上往上往上返回(由中間的兩個if判斷一層層返回),最終返回到主函式中結束判斷並輸出false。

值得一提的是主函式最後的return true是必須加上的,而且只能寫true,原因很簡單,在主函式中唯一沒有用if表示的可能狀態就是只有乙個根結點的情況,而這種情況下的樹顯然是乙個平衡二叉樹,故必須返回true,而且這裡不能寫else if,因為整個函式必須要有返回值,如果所有的return都在if之中,**是不能通過的,系統會在你的主函式的最後乙個括號處報錯。

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,並且左右兩個子樹都是一棵平衡二叉樹。先浮現在腦海中的是分別獲取左右子樹的深度,再對他們的差值進行比較。並且,每乙個子樹也必須是平衡的,因此也需要遞迴去判斷他們。當然最先是特殊情況的處理,當樹為空樹時,它就是平衡的。而在每...

leetcode演算法練習 平衡二叉樹

題目 給定乙個二叉樹,判斷它是否是高度平衡的二叉樹。本題中,一棵高度平衡二叉樹定義為 乙個二叉樹每個節點 的左右兩個子樹的高度差的絕對值不超過1。示例 1 給定二叉樹 3,9,20,null,null,15,7 3 9 20 15 7 返回 true 示例 2 給定二叉樹 1,2,2,3,3,nul...