1 leetcode226. 翻轉二叉樹
題目連結:226. 翻轉二叉樹 - 力扣(LeetCode)
文章連結:程式碼隨想錄
影片連結:聽說一位巨佬面Google被拒了,因為沒寫出翻轉二叉樹 | LeetCode:226.翻轉二叉樹_嗶哩嗶哩_bilibili
自己的思路:之前想過就是使用層序遍歷的方法來做這一道題目,後來感覺有一些行不通,就沒去嘗試,直接看影片,加看別人的程式碼做的,然後有一種自己很蠢的感覺
1.1 影片後的程式碼實現
就是左右位置交換進行儲存即可
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def invertTree(self, root: Optional[TreeNode]) -> Optional[TreeNode]:
if root == None:
return None
root.left,root.right = root.right,root.left
self.invertTree(root.left)
self.invertTree(root.right)
return root
1.2 小結
- 主要就是一個思路吧,遇到中間節點進行儲存,然後左右節點的位置進行交換,感覺遞迴我好像在這裡第一次理解
2 leetCode101.對稱二叉樹
題目連結:101. 對稱二叉樹 - 力扣(LeetCode)
文章連結:程式碼隨想錄
影片連結:新學期要從學習二叉樹開始! | LeetCode:101. 對稱二叉樹_嗶哩嗶哩_bilibili
自己的思路:之前想過就是使用層序遍歷的方法來做這一道題目,後來感覺有一些行不通,就沒去嘗試,直接看影片,加看別人的程式碼做的,然後有一種自己很蠢的感覺
2.1 看影片後做的方法
思路:
- 分析問題,這個題目是對稱二叉樹,首先考慮遞迴裡面的內容,那麼進入的是什麼序列呢,就是後序排序
- 確定排序以後,然後判斷哪些資料是需要返回的,分析出四種情況,然後再對資料進行迭代,迭代選擇的時候,就是看比較的資料是什麼,我們比較是不是對稱,然後就是由外向內比較
- 最後就是迭代,返回比較的兩個值相不相同
- 函式呼叫
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
if root == None:
return True
return self.compare(root.left,root.right)
def compare(self,left,right):
if left==None and right !=None:
return False
elif left!=None and right == None:
return False
elif left==None and right == None:
return True
elif left.val != right.val:
return False
outside = self.compare(left.left,right.right)
inside = self.compare(left.right,right.left)
same = outside and inside
return same
2.2 小結
- 這道題有一種,會了以後自己好傻,不會的時候,這是啥的感覺
3 LeetCode104.二叉樹的最大深度
題目連結:104. 二叉樹的最大深度 - 力扣(LeetCode)
文章連結:程式碼隨想錄
影片連結:二叉樹的高度和深度有啥區別?究竟用什麼遍歷順序?很多錄友搞不懂 | LeetCode:104.二叉樹的最大深度_嗶哩嗶哩_bilibili
自己的思路:一點思路,使用前序遍歷的方法,然後也有一點左右比較,進行下一層吧
3.1 看影片以後的程式碼實現
看了影片,覺得其實用高度來求,比深度,更容易一些
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def maxDepth(self, root: Optional[TreeNode]) -> int:
return self.get_height(root)
def get_height(self,node):
if node == None:
return 0
leftheight = self.get_height(node.left)
rightheight = self.get_height(node.right)
max_height = 1+max(leftheight,rightheight)
return max_height
3.2 小結
- 這一題裡面有一個地方寫錯了,就是一個類中,他們兩個屬於同一個級別的,但是第一次縮排了
- 在函式類別定義函式的時候,需要對其進行一個
self
4 leetcode111.二叉樹的最小深度
題目連結:111. 二叉樹的最小深度 - 力扣(LeetCode)
文章連結:程式碼隨想錄
影片連結:看起來好像做過,一寫就錯! | LeetCode:111.二叉樹的最小深度_嗶哩嗶哩_bilibili
思路:想著將上一道題改一下,沒想到報錯了,然後就看到了另一種情況,在想如何處理
4.1 看影片後的一部分處理
主要是面對左右有空的情況,學到了學到了,其實可以理解為這個二叉樹從頭遍歷,只需要兩邊計算即可,哈哈哈哈哈哈
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def minDepth(self, root: Optional[TreeNode]) -> int:
return self.depth(root)
def depth(self,node):
if node == None:
return 0
leftdepth = self.depth(node.left)
rightdepth = self.depth(node.right)
if node.left == None and node.right != None:
return 1+rightdepth
if node.right == None and node.left != None:
return 1+leftdepth
min_dep = 1+min(leftdepth,rightdepth)
return min_dep
4.2 小結
- 這個題,就是在一道一道下來後,發現這道題挺簡單的,然後嘗試自己寫了,寫通了還理解了
5 今日總結
- 記錄一下第一次因為專案通宵,後來結果我來寫了這個題目
- 遞迴真的有理解了,老師講的太清楚了,真的,可能第一次看會有不懂得,但是越看越明瞭,路越好走