輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。
在做這題是,我第一反應就是遍歷兩次二叉樹。第一遍記錄每個節點的深度,並將資訊存入hashmap中,key = node,value = depth。第二遍再遍歷一次二叉樹,同時判斷每個節點是不是都是平衡二叉樹。但這個方法並不是最優的,沒有進行剪枝,增加了不少不必要的開銷,而且使用了更多的額外空間。
private hashmap
nodedepth =
newhashmap
<
>()
;private
boolean flag =
true
;public
boolean
isbalanced_solution
(treenode root)
if(flag)
int depthleft = nodedepth.
get(root.left)
== null ?-1
: nodedepth.
get(root.left)
;int depthright = nodedepth.
get(root.right)
== null ?-1
: nodedepth.
get(root.right)
;return math.
abs(depthleft - depthright)
<2&&
isbalanced_solution
(root.left)
&&isbalanced_solution
(root.right);}
public
intdepth
(treenode node)
在提交完**後,我看到解題思路分享裡有乙個更棒的方法,作者是丁滿歷險記。他的方法從下往上遍歷,如果子樹是平衡二叉樹,則返回子樹的高度;如果發現子樹不是平衡二叉樹,則直接停止遍歷,這樣至多只對每個結點訪問一次。
public
boolean
isbalanced_solution
(treenode root)
public
intgetdepth
(treenode node)
劍指offer 39 平衡二叉樹
輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。首先,什麼是平衡二叉樹?如果二叉樹中任意結點的左右子樹深度相差不超過1,那麼它就是平衡二叉樹。最直接的做法,遍歷每個結點,借助乙個獲取樹深度的遞迴函式,根據該結點的左右子樹高度差判斷是否平衡,然後遞迴地對左右子樹進行判斷。public class sol...
劍指offer39 平衡二叉樹
題目描述 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。首先要搞清楚什麼是平衡二叉樹 它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。很直觀用遞迴來解決 coding utf 8 class treenode def init self,x self.va...
劍指offer 39 平衡二叉樹
1.題目描述 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。2.解題思路 預備知識 平衡二叉樹是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。思想 從根節點開始,先判斷左右子樹的高度差是否超過1,然後接著判斷左右子樹是否是平衡二叉樹。這邊用到了遞迴思想。如...