輸入一棵二叉樹,判斷該二叉樹是不是平衡二叉樹。正則表達式
平衡二叉樹:它是一棵空樹,或者它的左右子樹的高度差不超過1,同時它的左右子樹爲一棵二叉樹。而衡量樹和平衡因子說的就是左右子樹的高度差,能夠爲0,1,-1。以下圖它就是一棵平衡二叉樹:
算法
二叉樹的套路通常都是能夠經過遞歸的形式來將問題進行解決的,由於根節點存在左子樹和右子樹,其左子樹和右子樹又存在了其的左子樹和右子樹,因此經過遞歸的形式能夠將二叉樹的深度或者其餘問題求解。數組
要求該樹是平衡二叉樹,那麼必須知足三個條件: 微信
左子樹是平衡二叉樹數據結構
右子樹是平衡二叉樹機器學習
自底向上的作法,先判斷左右子樹是不是平衡二叉樹,再判斷左右子樹合起來的子結構是不是平衡。這種先訪問左右節點,最後根節點的順序很是符合樹的後序遍歷,因此咱們採用變形的遞歸的後序遍歷算法。 而求節點的高度(深度)咱們也採用一樣的變形後序遍從來作,很容易想到一個樹的深度爲左子樹和右子樹深度的最大值 + 1。因此問題規模轉變爲求左子樹和右子樹的深度,問題形式不變,規模變小,典型的遞歸問題,最後向上回溯便可求得輸入的根節點的高度。ide
| 思路B: 自上向下的方法,也是最直接的作法,遍歷每一個結點,藉助一個獲取樹深度的遞歸函數,根據該結點的左右子樹高度差判斷是否平衡,而後遞歸地對左右子樹進行判斷。 這種作法有很明顯的問題,在判斷上層結點的時候,會屢次重複遍歷下層結點,增長了沒必要要的開銷。函數
1# -*- coding:utf-8 -*- 2# class TreeNode: 3# def __init__(self, x): 4# self.val = x 5# self.left = None 6# self.right = None 7class Solution: 8 def IsBalanced_Solution(self, p): 9 return self.dfs(p) != -1 10 def dfs(self, p): 11 if p is None: 12 return 0 13 left = self.dfs(p.left) 14 if left == -1: 15 return -1 16 right = self.dfs(p.right) 17 if right == -1: 18 return -1 19 if abs(left - right) > 1: 20 return -1 21 return max(left, right) + 1
2020大廠筆試 | 網易提早批(1) 學習
2020大廠筆試 | 網易提早批(2) 指針
揹包九講(1)0/1揹包問題
揹包九講(2)徹底揹包問題
數據結構類題目
劍指offer刷題交流羣
掃碼添加微信,必定要備註研究方向+地點+學校+暱稱(如機器學習+上海+上交+湯姆),只有備註正確才能夠加羣噢。
▲長按加羣
image.png