劍指offer 55 2 平衡二叉樹

2021-10-05 03:26:21 字數 2206 閱讀 1330

輸入一棵二叉樹的根結點,判斷該樹是不是平衡二叉樹。

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

注意:規定空樹也是一棵平衡二叉樹。

後序遍歷,從底至頂,返回子樹深度,若判定某子樹不是平衡樹則 「剪枝」 ,即,直接返回。

depth(root) 函式:計算樹root的深度+判斷子樹平衡

返回值:

當節點root 左 / 右子樹的深度差≤1 :則返回當前子樹的深度,即節點 root 的左 / 右子樹的深度最大值 +1;

當節點root 左 / 右子樹的深度差》2 :則返回-1 ,代表此子樹不是平衡樹 。

終止條件:

當 root 為空:說明越過葉節點,因此返回高度 0;

當左(右)子樹深度為 −1 :代表此樹的 左(右)子樹 不是平衡樹,因此剪枝,直接返回 -1 ;(也可以寫進返回值條件裡,是一樣的)

isbalanced(root) 主函式:

返回值: 若 recur(root) != -1 ,則說明此樹平衡,返回 true ; 否則返回 false 。

class

solution

(object):

defisbalanced

(self, root):if

not root:

return

true

defdepth

(root):if

not root:

return

0 left = depth(root.left)

# if left == -1: return -1

right = depth(root.right)

# if right == -1: return -1

return

max(left,right)+1

ifabs

(left-right)

<

2and left!=-1

and right!=-1

else-1

return depth(root)!=-

1

先序遍歷,自頂向底,大量冗餘計算。

depth(root) 函式: 計算樹 root 的深度

終止條件: 當 root 為空,即越過葉子節點,則返回高度 0 ;

返回值: 返回左 / 右子樹的深度的最大值 +1。

isbalanced(root) 主函式: 判斷樹 root 是否平衡

特例處理: 若樹根節點 root 為空,則直接返回 true ;

返回值: 所有子樹都需要滿足平衡樹性質,因此以下三者使用與邏輯 and 連線;

abs(self.depth(root.left) - self.depth(root.right)) <= 1 :判斷 當前子樹 是否是平衡樹;

self.isbalanced(root.left) : 先序遍歷遞迴,判斷 當前子樹的左子樹 是否是平衡樹;

self.isbalanced(root.right) : 先序遍歷遞迴,判斷 當前子樹的右子樹 是否是平衡樹;

class

solution

:def

isbalanced

(self, root: treenode)

->

bool:if

not root:

return

true

return

abs(self.depth(root.left)

- self.depth(root.right)

)<

2and \

self.isbalanced(root.left)

and self.isbalanced(root.right)

defdepth

(self, root):if

not root:

return

0return

max(self.depth(root.left)

, self.depth(root.right))+

1

55 2 平衡二叉樹

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

劍指offer之面試題55 2 平衡二叉樹

1 題目 輸入一顆二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中的任意節點的左 右子樹的深度相差不超過1,那麼它就是一顆平衡二叉樹。輸入引數 二叉樹的根節點,指向二叉樹深度的int型指標 輸出結果 true 或者 false 2 解題 這道題的關鍵在於如何在只遍歷一次二叉樹的情況下,對是否...

劍指offer 平衡二叉樹

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹 1 重複遍歷結點 參考上一題求二叉樹的深度,先求出根結點的左右子樹的深度,然後判斷它們的深度相差不超過1,如果否,則不是一棵二叉樹 如果是,再用同樣的方法分別判斷左子樹和右子樹是否為平衡二叉樹,如果都是,則這就是一棵平衡二叉樹。但上面的方法在判斷子樹是否...