理论基础
二叉树的种类:
- 满二叉树
- 完全二叉树:最下面一层中间不空
- 二叉搜索树:有序树
左子树上所有结点的值<根节点<右子树上所有结点的值
- 平衡二叉搜索树(AVL):左右子树高度差不大于1
存储方式:
链式存储(链表)
线性存储(k的孩子对应2k+1,2k+2)
遍历方式:
深度优先:前序,中序,后序
广度优先:层序
二叉树的定义:
怎么写class Node
递归遍历 (必须掌握)
深度优先
前序,中序,后序
class Solution:
def preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
self.preorder(root, res)
return res
def preorder(self, node: Optional[TreeNode], res: List[int]):
if node == None:
return
res.append(node.val)
self.preorder(node.left, res)
self.preorder(node.right, res)
class Solution:
def inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
self.inorder(root, res)
return res
def inorder(self, node: Optional[TreeNode], res: List[int]):
if node == None:
return
self.inorder(node.left, res)
res.append(node.val)
self.inorder(node.right, res)
class Solution:
def postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
res = []
self.postorder(root, res)
return res
def postorder(self, node: Optional[TreeNode], res: List[int]) -> None:
if node == None:
return
self.postorder(node.left, res)
self.postorder(node.right, res)
res.append(node.val)
层序遍历
广度优先
class Solution:
def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
# 必须先判断root是否为空
if root == None:
return []
result = []
q = deque()
q.append(root)
# print(root.data)
while(len(q)):
size = len(q)
level_res = []
for i in range(size):
node = q.popleft()
level_res.append(node.val)
if node.left != None:
q.append(node.left)
if node.right != None:
q.append(node.right)
result.append(level_res)
return result
- 104.二叉树的最大深度(opens new window)
- 111.二叉树的最小深度
- 这两道题深度优先/广度优先都行,广度优先已掌握