每日算法題 | 劍指offer 二叉樹專題 (16) 平衡二叉樹

每日算法題 | 劍指offer 二叉樹專題 (16) 平衡二叉樹

題目

平衡二叉樹

題目要求

輸入一棵二叉樹,判斷該二叉樹是不是平衡二叉樹。正則表達式

| 備知識

平衡二叉樹:它是一棵空樹,或者它的左右子樹的高度差不超過1,同時它的左右子樹爲一棵二叉樹。而衡量樹和平衡因子說的就是左右子樹的高度差,能夠爲0,1,-1。以下圖它就是一棵平衡二叉樹:
每日算法題 | 劍指offer 二叉樹專題 (16) 平衡二叉樹算法

解題思路

二叉樹的套路通常都是能夠經過遞歸的形式來將問題進行解決的,由於根節點存在左子樹和右子樹,其左子樹和右子樹又存在了其的左子樹和右子樹,因此經過遞歸的形式能夠將二叉樹的深度或者其餘問題求解。數組

要求該樹是平衡二叉樹,那麼必須知足三個條件: 微信

  • 左子樹是平衡二叉樹數據結構

  • 右子樹是平衡二叉樹機器學習

  • 左右子樹的高度之差 <= 1

| 思路A

自底向上的作法,先判斷左右子樹是不是平衡二叉樹,再判斷左右子樹合起來的子結構是不是平衡。這種先訪問左右節點,最後根節點的順序很是符合樹的後序遍歷,因此咱們採用變形的遞歸的後序遍歷算法。 而求節點的高度(深度)咱們也採用一樣的變形後序遍從來作,很容易想到一個樹的深度爲左子樹和右子樹深度的最大值 + 1。因此問題規模轉變爲求左子樹和右子樹的深度,問題形式不變,規模變小,典型的遞歸問題,最後向上回溯便可求得輸入的根節點的高度。ide

| 思路B: 自上向下的方法,也是最直接的作法,遍歷每一個結點,藉助一個獲取樹深度的遞歸函數,根據該結點的左右子樹高度差判斷是否平衡,而後遞歸地對左右子樹進行判斷。 這種作法有很明顯的問題,在判斷上層結點的時候,會屢次重複遍歷下層結點,增長了沒必要要的開銷。函數

代碼

Python :

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)徹底揹包問題

數據結構類題目

  • LinkedList
  • 003-從尾到頭打印鏈表
  • 014-鏈表中倒數第k個結點
  • 015-反轉鏈表
  • 016-合併兩個或k個有序鏈表
  • 025-複雜鏈表的複製
  • 036-兩個鏈表的第一個公共結點
  • 055-鏈表中環的入口結點
  • 056-刪除鏈表中重複的結點
  • Tree
  • 004-重建二叉樹
  • 017-樹的子結構
  • 018-二叉樹的鏡像
  • 022-從上往下打印二叉樹
  • 023-二叉搜索樹的後序遍歷序列
  • 024-二叉樹中和爲某一值的路徑
  • 026-二叉搜索樹與雙向鏈表
  • 038-二叉樹的深度
  • 039-平衡二叉樹
  • 057-二叉樹的下一個結點
  • 058-對稱的二叉樹
  • 059-按之字形順序打印二叉樹
  • 060-把二叉樹打印成多行
  • 061-序列化二叉樹
  • 062-二叉搜索樹的第k個結點
  • Stack & Queue
  • 005-用兩個棧實現隊列
  • 020-包含min函數的棧
  • 021-棧的壓入、彈出序列
  • 044-翻轉單詞順序列(棧)
  • 064-滑動窗口的最大值(雙端隊列)
  • Heap
  • 029-最小的K個數
  • Hash Table
  • 034-第一個只出現一次的字符
  • 065-矩陣中的路徑(BFS)
  • 066-機器人的運動範圍(DFS)
  • 具體算法類題目
  • 斐波那契數列
  • 007-斐波拉契數列
  • 008-跳臺階
  • 009-變態跳臺階
  • 010-矩形覆蓋
  • 搜索算法
  • 001-二維數組查找
  • 006-旋轉數組的最小數字(二分查找)
  • 037-數字在排序數組中出現的次數(二分查找)
  • 全排列
  • 027-字符串的排列
  • 動態規劃
  • 030-連續子數組的最大和
  • 052-正則表達式匹配(我用的暴力)
  • 回溯
  • 065-矩陣中的路徑(BFS)
  • 066-機器人的運動範圍(DFS)
  • 排序
  • 035-數組中的逆序對(歸併排序)
  • 029-最小的K個數(堆排序)
  • 029-最小的K個數(快速排序)
  • 位運算
  • 011-二進制中1的個數
  • 012-數值的整數次方
  • 040-數組中只出現一次的數字
  • 其餘算法
  • 002-替換空格
  • 013-調整數組順序使奇數位於偶數前面
  • 028-數組中出現次數超過一半的數字
  • 031-整數中1出現的次數(從1到n整數中1出現的次數)
  • 032-把數組排成最小的數
  • 033-醜數
  • 041-和爲S的連續正數序列(滑動窗口思想)
  • 042-和爲S的兩個數字(雙指針思想)
  • 043-左旋轉字符串(矩陣翻轉)
  • 046-孩子們的遊戲-圓圈中最後剩下的數(約瑟夫環)
  • 051-構建乘積數組

劍指offer刷題交流羣

掃碼添加微信,必定要備註研究方向+地點+學校+暱稱(如機器學習+上海+上交+湯姆),只有備註正確才能夠加羣噢。

每日算法題 | 劍指offer 二叉樹專題 (16) 平衡二叉樹

▲長按加羣

每日算法題 | 劍指offer 二叉樹專題 (16) 平衡二叉樹

image.png

相關文章
相關標籤/搜索