廣度優先搜索算法,這個代碼不只適應於樹也適應於圖。圖會有迴路結構,須要判重,採用set去重。node
二叉樹的最大10四、最小深度111算法
思路:app
1、採用遞歸的思路spa
2、採用BFS廣度優先搜索code
3、深度優先搜索blog
此圖是廣度優先搜索算法,一層一層去遍歷,終點是找到葉子節點爲止。遞歸
最開始的葉子節點是最小深度,最後到達的是最大深度。leetcode
此圖是深度優先搜索的方法,每次遍歷更新最大和最小。仍是以判斷葉子節點。get
時間複雜度都爲O(n),由於總共有n個節點,都須要遍歷一次,因此是O(n)it
雖然推理是採用廣度或者深度優先的策略,可是實際代碼採用的是遞歸的思路寫的。
二叉樹的最大深度代碼:
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def maxDepth(self, root): """ :type root: TreeNode :rtype: int """ if not root: return 0 #若是是葉子節點則返回0 return 1+max(self.maxDepth(root.left),self.maxDepth(root.right)) #調用左子樹和右子樹,最大值加1
二叉樹的最小深度代碼:
# Definition for a binary tree node. # class TreeNode(object): # def __init__(self, x): # self.val = x # self.left = None # self.right = None class Solution(object): def minDepth(self, root): """ :type root: TreeNode :rtype: int """ if not root: #若是是空節點,直接返回0 return 0 if not root.left: #若是左子節點爲空,那麼去查找右子樹的節點 return 1+self.minDepth(root.right) elif not root.right: #同理,若是右子節點爲空,那麼去查找左子樹的節點 return 1+self.minDepth(root.left) else: #不然,說明有左右子節點,左右子樹的最小值加1 return 1+min(self.minDepth(root.left),self.minDepth(root.right))
括號生成
https://leetcode-cn.com/problems/generate-parentheses/submissions/
思路:
我也沒聽懂,後期花點時間弄懂,暫記着。
代碼:
class Solution(object): def generateParenthesis(self, n): """ :type n: int :rtype: List[str] """ self.list = [] self._gen(0,0,n,"") return self.list def _gen(self,left,right,n,result): if left==n and right==n: #左右括號已經配額完畢 self.list.append(result) #將result加入到結果當中 return if left < n: self._gen(left+1,right,n,result+'(') #加入左括號,隨時均可以加進去,只要沒有用完均可以 if left>right and right<n: #右括號個數小於左括號而且右括號沒有用完 self._gen(left,right+1,n,result+')') #加入右括號