Python_算法_二叉树
递归法、迭代法、广度优先法
二叉树 - 前中后序遍历 - 递归法
使用递归法,发现其实只是根节点放在什么地方而已。
前序:根-左-右
中序:左-中-右
后序:左-右-中
前序遍历 - 递归法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 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 preorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
def get_forward_nodes(node):
p_list = []
p_list += [node.val]
if node.left:
p_list += get_forward_nodes(node.left)
if node.right:
p_list += get_forward_nodes(node.right)
return p_list
return get_forward_nodes(root) if root else []中序遍历 - 递归法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 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 inorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
def get_forward_nodes(node):
p_list = []
if node.left:
p_list += get_forward_nodes(node.left)
p_list += [node.val]
if node.right:
p_list += get_forward_nodes(node.right)
return p_list
return get_forward_nodes(root) if root else []后续遍历 - 递归法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# 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 postorderTraversal(self, root: Optional[TreeNode]) -> List[int]:
def get_forward_nodes(node):
p_list = []
if node.left:
p_list += get_forward_nodes(node.left)
if node.right:
p_list += get_forward_nodes(node.right)
p_list += [node.val]
return p_list
return get_forward_nodes(root) if root else []```层序遍历
迭代法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28# 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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
def get_level_nodes(nodes):
current_nodes = []
next_nodes = []
for node in nodes:
current_nodes.append(node.val)
if node.left:
next_nodes.append(node.left)
if node.right:
next_nodes.append(node.right)
return current_nodes, next_nodes
result_nodes = []
if root:
next_nodes = [root]
while next_nodes:
current_nodes, next_nodes = get_level_nodes(next_nodes)
result_nodes.append(current_nodes)
else:
return []
return result_nodesBFS算法(广度优先搜索)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28# 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 levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
dq = deque([]) # 栈
if not root:
return []
dq.append(root)
result_list = []
while dq:
current_level_nodes = []
dq_size = len(dq)
while dq_size:
popleft_node = dq.popleft()
dq_size -= 1
current_level_nodes.append(popleft_node.val)
if popleft_node.left:
dq.append(popleft_node.left)
if popleft_node.right:
dq.append(popleft_node.right)
result_list.append(current_level_nodes)
return result_list
另:BFS 广度优先搜索一般用来查询 层序遍历,引申出二叉树最短路径的问题
二叉树 - 最大深度
BFS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26# 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:
if not root:
return 0
dq = deque([])
dq.append(root)
max_len = 0
while dq:
max_len += 1
dq_size = len(dq)
while dq_size:
dq_size -= 1
node = dq.popleft()
if node.left:
dq.append(node.left)
if node.right:
dq.append(node.right)
return max_len
递归法
递归法真的是太简洁了
1
2
3
4
5
6
7
8
9
10
11# 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:
def get_depth(node):
return 0 if not node else max(get_depth(node.left)+1, get_depth(node.right)+1)
return get_depth(root)
对称二叉树
1 | # Definition for a binary tree node. |