简述
最近因为老板diss我,于是决定开始刷题。这一看大学的东西基本忘光了,现在开始恶补报复老板!!
二叉树
什么是二叉树
二叉树是一种数据结构,它由节点(Nodes)组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。
二叉树性质
二叉性:每个节点最多有两个子树,分别标记为左子树和右子树。
无序性:二叉树的子树没有顺序之分,但根据特定的遍历规则(如前序、中序、后序遍历),可以区分二叉搜索树、堆等有序二叉树。
层次性:二叉树具有明显的层次结构,从根节点开始,每一层节点数最多是上一层的两倍。
二叉树有多种特殊形态,包括但不限于:
- 满二叉树:所有层级都有最大节点数,即每个节点都有两个子节点。
- 完全二叉树:除了最后一层外,所有层都是满的,且最后一层的节点都尽可能靠左。
- 二叉搜索树(BST):左子树上所有节点的值小于它的根节点的值;右子树上所有节点的值大于它的根节点的值。
- 平衡二叉树:左右两个子树的高度差不超过1,如AVL树和红黑树。 堆:一种特殊的完全二叉树,常用于实现优先队列,如最大堆、最小堆。
树的遍历
其实到这里我就直接懵逼了,根据搜索有BFS(广度优先搜索)、DFS(深度优先搜索)、先序遍历、中序遍历、后序遍历。这都是啥关系,最后看了很多,个人总结一下(错误请指正不必客气!):
- BFS和DFS这两个是用来做图和树的遍历的两种思想。
- 先、中、后遍历方法是针对树这种数据结构遍历的方法(这三种只针对树)
- 可以把先、中、后看作是DFS的一个子集,就是说DFS中包含这三个方法
- 先:父左右、中:左父右、后:左右父这是顺序
代码实现
咱们重头实现
# 构建如下的二叉树
# 1
# / \
# 2 3
# / \ \
# 4 5 6
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class TreeNodeTool:
def buildTree(self):
self.root = TreeNode(1)
self.root.left = TreeNode(2, TreeNode(4), TreeNode(5))
self.root.right = TreeNode(3, None, TreeNode(6))
def bfs_traversal(self):
traversal_result = []
if not self.root:
return traversal_result
queue = deque([self.root])
while queue:
current_node = queue.popleft()
traversal_result.append(current_node.val)
if current_node.left:
queue.append(current_node.left)
if current_node.right:
queue.append(current_node.right)
return traversal_result
def dfs_preorder_traversal(self):
traversal_result = []
def dfs (node):
if not node:
return
traversal_result.append(node.val)
dfs(node.left)
dfs(node.right)
dfs(self.root)
print(f"深度优先搜索(先序遍历):{traversal_result}")
def dfs_inorder_traversal(self):
traversal_result = []
def dfs (node):
if not node:
return
dfs(node.left)
traversal_result.append(node.val)
dfs(node.right)
dfs(self.root)
print(f"深度优先搜索(中序遍历):{traversal_result}")
def dfs_postorder_traversal(self):
traversal_result = []
def dfs (node):
if not node:
return
dfs(node.left)
dfs(node.right)
traversal_result.append(node.val)
dfs(self.root)
print(f"深度优先搜索(后序遍历):{traversal_result}")
if __name__ == '__main__':
tree_node_tool = TreeNodeTool()
tree = tree_node_tool.buildTree()
tree_node_tool.bfs_traversal()
tree_node_tool.dfs_preorder_traversal()
tree_node_tool.dfs_inorder_traversal()
tree_node_tool.dfs_postorder_traversal()
#广度优先搜索:[1, 2, 3, 4, 5, 6]
#深度优先搜索(先序遍历):[1, 2, 4, 5, 3, 6]
#深度优先搜索(中序遍历):[4, 2, 5, 1, 3, 6]
#深度优先搜索(后序遍历):[4, 5, 2, 6, 3, 1]