第2章 面試需要的基礎知識
第3章 高質量的代碼
第4章 解決面試題的思路
第5章 優化時間和空間效率
面試題39 : 數組中出現次數超過一半的數字
面試題40 : 最小的k個數
面試題42 : 連續子數組的最大和
面試題43 : 從1到n整數中1出現的次數
面試題45 : 把數組排成最小的數
面試題49 : 醜數
面試題50 : 第一個只出現一次的字符
面試題51 : 數組中的逆序對
面試題52 : 兩個鏈表的第一個公共結點
面試題53 : 在排序數組中查找數字
面試題55 : 二叉樹的深度、平衡二叉樹
第6章 面試中的各項能力
第7章 兩個面試案例
題目描述
牛客網
輸入一棵二叉樹,求該樹的深度。從根結點到葉結點依次經過的結點(含根、葉結點)形成樹的一條路徑,最長路徑的長度爲樹的深度。
解題思路
方法一:
廣度優先搜索,一層層遍歷二叉樹,每遍歷一層深度加一。
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def TreeDepth(self, pRoot):
# write code here
if not pRoot:
return 0
depth = 0
stack = [pRoot]
while stack:
depth += 1
layer = []
for node in stack:
if node.left:
layer.append(node.left)
if node.right:
layer.append(node.right)
stack = layer
return depth
方法二:
深度優先搜索,利用深搜可以一次性遍歷完一條路徑。每次都進入子節點,直到葉子節點,然後比較左右葉子節點路徑長度,返回最大長度。由於遞歸需要用到系統棧,所以空間複雜度還是O(n)。
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def TreeDepth(self, pRoot):
# write code here
if not pRoot:
return 0
def dfs(root, depth):
if not root:
return depth
left = dfs(root.left, depth + 1)
right = dfs(root.right, depth + 1)
return max(left, right)
return dfs(pRoot, 0)
題目描述
輸入一棵二叉樹的根節點,判斷該樹是不是平衡二叉樹。如果某二叉樹中任意節點的左、右子樹的深度相差不超過1,那麼它就是一顆平衡二叉樹。
解題思路
在上題的基礎上稍微修改下即可。得到兩條路徑長度後,在比較下長度差是否大於1,增加一個判斷標誌即可。
實戰
# 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
if not pRoot:
return True
def dfs(root, depth):
if not root:
return depth, True
left, flag1 = dfs(root.left, depth + 1)
right, flag2 = dfs(root.right, depth + 1)
if flag1 and flag2:
if abs(left - right) <= 1:
return max(left, right), True
return left, False
depth, flag = dfs(pRoot, 0)
return flag