劍指offer39 平衡二叉樹

2021-09-10 03:43:38 字數 1787 閱讀 1371

題目描述

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。

首先要搞清楚什麼是平衡二叉樹:它是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。

很直觀用遞迴來解決:

# -*- coding:utf-8 -*-

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

:def

isbalanced_solution

(self, proot)

:# write code here

ifnot proot:

return

true

return

abs(self.tree_height(proot.left)

- self.tree_height(proot.right)

)<=

1and\

self.isbalanced_solution(proot.left)

and self.isbalanced_solution(proot.right)

deftree_height

(self, node):if

not node:

return

0return1+

max(self.tree_height(node.left)

, self.tree_height(node.right)

)

上面的做法很直觀但有很明顯的問題,在判斷上層結點的時候,會多次重複遍歷下層結點,增加了不必要的開銷。如果改為從下往上遍歷,如果子樹是平衡二叉樹,則返回子樹的高度;如果發現子樹不是平衡二叉樹,則直接停止遍歷,這樣至多只對每個結點訪問一次。
# -*- coding:utf-8 -*-

# class treenode:

# def __init__(self, x):

# self.val = x

# self.left = none

# self.right = none

class

solution

:def

isbalanced_solution

(self, proot)

:# write code here

return self.tree_height(proot)!=-

1def

tree_height

(self, node):if

not node:

return

0 left = self.tree_height(node.left)

if left ==-1

:# 每次都判斷下是否平衡

return-1

right = self.tree_height(node.right)

if right ==-1

:return-1

# 最後再判斷下是否平衡,如果平衡就返回該節點高度

return-1

ifabs

(left-right)

>

1else1+

max(left, right)

劍指offer 39 平衡二叉樹

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。首先,什麼是平衡二叉樹?如果二叉樹中任意結點的左右子樹深度相差不超過1,那麼它就是平衡二叉樹。最直接的做法,遍歷每個結點,借助乙個獲取樹深度的遞迴函式,根據該結點的左右子樹高度差判斷是否平衡,然後遞迴地對左右子樹進行判斷。public class sol...

劍指offer 39 平衡二叉樹

1.題目描述 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。2.解題思路 預備知識 平衡二叉樹是一 棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。思想 從根節點開始,先判斷左右子樹的高度差是否超過1,然後接著判斷左右子樹是否是平衡二叉樹。這邊用到了遞迴思想。如...

劍指offer 39 平衡二叉樹

輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。在做這題是,我第一反應就是遍歷兩次二叉樹。第一遍記錄每個節點的深度,並將資訊存入hashmap中,key node,value depth。第二遍再遍歷一次二叉樹,同時判斷每個節點是不是都是平衡二叉樹。但這個方法並不是最優的,沒有進行剪枝,增加了不少不必...