本文記錄下在使用刷Leetcode的一些記錄,主要使用變成語言為Python3。
tree的定義:
Python中二叉樹的定義
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
複製程式碼
其他程式語言常見的定義:
記憶體模型:二叉樹分類
1. 滿二叉樹(Full Binary Tree)
除最後一層無任何子節點外,每一層上的所有結點都有兩個子結點二叉樹,如下圖:
2. 完全二叉樹(Complete Binary Tree)
如果一棵二叉樹有n個結點,深度為k,它的每一個結點都與高度為k的滿二叉樹中編號為1~n的結點一一對應,則稱該樹為完全二叉樹。如下圖:
3. 平衡二叉樹(Balanced Binary Tree)
平衡二叉樹又稱AVL樹,平衡二叉樹是一棵空樹或它的左右兩個子樹的高度差的絕對值不超過1,並且左右兩個子樹都是一棵平衡二叉樹。如下圖:
4.二叉搜尋樹
二叉查詢樹(Binary Search Tree),(又:二叉搜尋樹,二叉排序樹)它或者是一棵空樹,或者是具有下列性質的二叉樹: 若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值; 若它的右子樹不空,則右子樹上所有結點的值均大於它的根結點的值; 它的左、右子樹也分別為二叉排序樹。 如下圖:
常用演算法操作
通用模板
## 1個root
def slove(root):
if not root: return xxxx
if f(root): return yyyy
l = slove(root.left)
r = slove(root.right)
return g(root, l, r)
## 2個root
def slove(p, q):
if not p and not q: return xxxx
if f(p, q): reutn yyyy
c1 = slove(p.child, q.child)
c2 = slove(p.child, q.child)
return g(p, q, c1, c2)
複製程式碼
三種遍歷
常見的遍歷有先序遍歷,中序遍歷,後序遍歷。
- 先序遍歷:根節點->左子樹->右子樹
- 中序遍歷:左子樹->根節點->右子樹
- 後序遍歷:左子樹->右子樹->根節點
先序遍歷
def preorder(root):
if not root: return
print(root.val)
preorder(root.left)
preorder(root.right)
複製程式碼
中序遍歷
def inorder(root):
if not root: return
inorder(root.left)
print(root.val)
inorder(root.right)
複製程式碼
後序遍歷
def postorder(root):
if not root: return
postorder(root)
postorder(root)
print(root.val)
複製程式碼
建立二叉搜尋樹(BST)
根據一個nums陣列,建立一個BST
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
def createBST(nums):
root = None
for num in nums:
root = insert(root, num)
return root
def insert(root, val):
# 注意 這個二叉樹不是平衡的
if not root: return TreeNode(val)
if val <= root.val:
root.left = insert(root.left, val)
else:
root.right = insert(root.right, val)
return root
def inorder(root):
if not root: return
inorder(root.left)
print(root.val)
inorder(root.right)
def inorder_list(root):
# 得到中序遍歷的陣列
res = []
if not root: return []
res.append(root.val)
res.extend(inorder_list(root.left))
res.extend(inorder_list(root.right))
return res
if __name__ == "__main__":
nums = [5,1,4,2,3,6]
root = createBST(nums)
inorder(root)
複製程式碼
上面的程式碼執行結果為:
1
2
3
4
5
6
複製程式碼
找到二叉樹的最大值
def maxVal(root):
max_left = maxVal(root.left)
max_right = maxVal(root.right)
return max(root.val, max_left, max_right)
複製程式碼
最大深度
leetcode 104
def maxDeep(root):
if not root: return 0
l = maxDeep(root.left)
r = maxDeep(root.right)
return max(l, r) + 1
複製程式碼
最小深度
leetcod 111
def minDeep(root):
if not root: return 0
if not root.leght and root.right return 1
l = minDeep(root.left)
r = minDeep(root.right)
if not root.left: return 1 + r
if not root.right: return 1 + l # 1 + left
return max(l, r) + 1
複製程式碼
BFS
def bfs(root):
"""
:type root: TreeNode
:rtype: List[List[int]]
"""
res = []
from Queue import Queue
queue = Queue()
queue.put(root)
while (not queue.empty()):
temp = Queue()
row = []
while(not queue.empty()):
node = queue.get()
if node:
row.append(node.val)
if node.left:
temp.put(node.left)
if node.right:
temp.put(node.right)
queue = temp
res.append(row)
return res
複製程式碼
建立一個平衡的BST
class Solution(object):
def sortedArrayToBST(self, nums):
"""
:type nums: List[int]
:rtype: TreeNode
"""
def sortedBST(nums, start, end):
if start > end: return None
mid = (start + end) // 2
root = TreeNode(nums[mid])
root.left = sortedBST(nums, start, mid-1)
root.right = sortedBST(nums, mid+1, end)
return root
if not nums: return None
return sortedBST(nums, 0, len(nums)-1)
複製程式碼
引用
文章中的視截圖來自youtube 博主花花,感謝博主的視訊。本文的參考的youtube 視訊連結