Skip to content

Commit 0ffaeea

Browse files
committed
DFS BFS
1 parent 42bd78b commit 0ffaeea

File tree

5 files changed

+145
-0
lines changed

5 files changed

+145
-0
lines changed

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@
66
- 杨辉三角
77
-
88
- dijkstra 最短路径
9+
- 深度优先算法
10+
- 广度优先算法
911
- 滑动窗口
1012
- 最小包含窗口
1113
- 排序

src/tree/breadth_first_search.py

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
from collections import deque
2+
from typing import List
3+
4+
class TreeNode:
5+
def __init__(self, val=0, left=None, right=None):
6+
self.val = val
7+
self.left = left
8+
self.right = right
9+
10+
def levelOrder(root: TreeNode) -> List[List[int]]:
11+
if not root:
12+
return []
13+
14+
queue = deque([root])
15+
result = []
16+
17+
while queue:
18+
level_size = len(queue)
19+
level_nodes = []
20+
21+
for _ in range(level_size):
22+
node = queue.popleft()
23+
level_nodes.append(node.val)
24+
25+
if node.left:
26+
queue.append(node.left)
27+
if node.right:
28+
queue.append(node.right)
29+
30+
result.append(level_nodes)
31+
32+
return result
33+
34+
node1 = TreeNode(1)
35+
node2 = TreeNode(2)
36+
node3 = TreeNode(3)
37+
node4 = TreeNode(4)
38+
node5 = TreeNode(5)
39+
node6 = TreeNode(6)
40+
node7 = TreeNode(7)
41+
node1.left = node2
42+
node1.right = node3
43+
node2.left = node4
44+
node2.right = node5
45+
node3.left = node6
46+
node3.right = node7
47+
48+
result = levelOrder(node1)
49+
print(result)

src/tree/depth_first_search.py

+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
class TreeNode:
2+
def __init__(self, val=0, left=None, right=None):
3+
self.val = val
4+
self.left = left
5+
self.right = right
6+
7+
def preorderTraversal(root: TreeNode) -> List[int]:
8+
if not root:
9+
return []
10+
11+
result = []
12+
stack = [root]
13+
14+
while stack:
15+
node = stack.pop()
16+
result.append(node.val)
17+
18+
if node.right:
19+
stack.append(node.right)
20+
if node.left:
21+
stack.append(node.left)
22+
23+
return result
24+
25+
def inorderTraversal(root: TreeNode) -> List[int]:
26+
if not root:
27+
return []
28+
29+
result = []
30+
stack = []
31+
node = root
32+
33+
while stack or node:
34+
while node:
35+
stack.append(node)
36+
node = node.left
37+
node = stack.pop()
38+
result.append(node.val)
39+
node = node.right
40+
41+
return result
42+
43+
def postorderTraversal(root: TreeNode) -> List[int]:
44+
if not root:
45+
return []
46+
47+
result = []
48+
stack = [root]
49+
50+
while stack:
51+
node = stack.pop()
52+
result.append(node.val)
53+
54+
if node.left:
55+
stack.append(node.left)
56+
if node.right:
57+
stack.append(node.right)
58+
59+
return result[::-1]

src/tree/广度优先算法.md

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
这个实现使用了一个`队列(deque)`来实现`广度优先遍历`。算法的流程如下:
2+
3+
- 首先判断根节点是否为空,如果为空则返回一个空列表。
4+
- 将根节点加入到队列中。
5+
- 开始循环,直到队列为空。在每次循环中:
6+
- 获取当前队列的长度,即当前层级的节点数量。
7+
- 创建一个空列表来存储当前层级的节点值。
8+
- 依次从队列中取出节点,将节点值添加到当前层级的列表中,并且如果节点有左右子节点,则将它们加入到队列中。
9+
- 将当前层级的列表添加到最终结果中。
10+
- 循环结束后,返回最终的结果列表。
11+
- 这个算法的时间复杂度为O(n),其中n是二叉树的节点数量,因为我们需要访问每个节点一次。空间复杂度为O(n),因为在- 最坏情况下,我们需要在队列中存储所有的节点。

src/tree/深度优先算法.md

+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
这里我们实现三种深度优先遍历的方法:前序遍历、中序遍历和后序遍历。
2+
这个实现使用了`栈(list)`来实现`深度优先遍历`。算法的流程如下:
3+
4+
## 前序遍历:
5+
首先判断根节点是否为空,如果为空则返回一个空列表。
6+
创建一个空列表来存储遍历结果,以及一个栈。
7+
将根节点压入栈中,然后开始循环,直到栈为空。
8+
在每次循环中,从栈中弹出一个节点,将其值添加到结果列表中,然后将其右子节点和左子节点(如果存在)依次压入栈中。
9+
最终返回结果列表。
10+
## 中序遍历:
11+
首先判断根节点是否为空,如果为空则返回一个空列表。
12+
创建一个空列表来存储遍历结果,以及一个栈。
13+
将当前节点设置为根节点,然后开始循环,直到当前节点为空且栈为空。
14+
在每次循环中,如果当前节点不为空,则将其压入栈中,并将当前节点设置为其左子节点。
15+
如果当前节点为空,则从栈中弹出一个节点,将其值添加到结果列表中,并将当前节点设置为其右子节点。
16+
最终返回结果列表。
17+
## 后序遍历:
18+
首先判断根节点是否为空,如果为空则返回一个空列表。
19+
创建一个空列表来存储遍历结果,以及一个栈。
20+
将根节点压入栈中,然后开始循环,直到栈为空。
21+
在每次循环中,从栈中弹出一个节点,将其值添加到结果列表的开头。
22+
然后将该节点的左子节点和右子节点(如果存在)依次压入栈中。
23+
最终返回结果列表。
24+
这些算法的时间复杂度都为O(n),其中n是二叉树的节点数量,因为我们需要访问每个节点一次。空间复杂度为O(n),因为在最坏情况下,我们需要在栈中存储所有的节点。

0 commit comments

Comments
 (0)