# Python算法——树的序列化与反序列化

## Python中的树的序列化与反序列化

### 树的序列化

#### 前序遍历序列化

class TreeNode:
def __init__(self, value):
self.val = value
self.left = None
self.right = None

def serialize(root):
if not root:
return "null"

left = serialize(root.left)
right = serialize(root.right)

return str(root.val) + "," + left + "," + right


#### 层序遍历序列化

from collections import deque

def serialize_level_order(root):
if not root:
return "null"

result = []
queue = deque([root])

while queue:
node = queue.popleft()
if node:
result.append(str(node.val))
queue.append(node.left)
queue.append(node.right)
else:
result.append("null")

return ",".join(result)


### 树的反序列化

#### 前序遍历反序列化

def deserialize(data):
def helper(values):
val = values.pop(0)
if val == "null":
return None
node = TreeNode(int(val))
node.left = helper(values)
node.right = helper(values)
return node

values = data.split(",")
return helper(values)


#### 层序遍历反序列化

def deserialize_level_order(data):
values = data.split(",")
if not values or values[0] == "null":
return None

root = TreeNode(int(values[0]))
queue = deque([root])
i = 1

while i < len(values):
current = queue.popleft()

left_val = values[i]
i += 1
if left_val != "null":
current.left = TreeNode(int(left_val))
queue.append(current.left)

right_val = values[i]
i += 1
if right_val != "null":
current.right = TreeNode(int(right_val))
queue.append(current.right)

return root


### 示例

# 构建二叉树
"""
1
/ \
2   3
/ \
4   5
"""
root = TreeNode(1)
root.left = TreeNode(2)
root.right = TreeNode(3)
root.left.left = TreeNode(4)
root.left.right = TreeNode(5)


#### 前序遍历序列化与反序列化

# 前序遍历序列化
serialized_tree = serialize(root)
print("前序遍历序列化:", serialized_tree)

# 前序遍历反序列化
deserialized_tree = deserialize(serialized_tree)

# 验证反序列化结果
def print_tree(root):
if root:
print_tree(root.left)
print(root.val, end=" ")
print_tree(root.right)

print("反序列化后的树:")
print_tree(deserialized_tree)


前序遍历序列化: 1,2,4,null,null,5,null,null,3,null,null

4 2 5 1 3


#### 层序遍历序列化与反序列化

# 层序遍历序列化
serialized_tree_level_order = serialize_level_order(root)
print("层序遍历序列化:", serialized_tree_level_order)

# 层序遍历反序列化
deserialized_tree_level_order = deserialize_level_order(serialized_tree_level_order)

# 验证反序列化结果
print("反序列化后的树:")
print_tree(deserialized_tree_level_order)


层序遍历序列化: 1,2,3,4,5,null,null,null,null,null,null

1 2 3 4 5


|
10天前
|

Java一分钟之-Java序列化与反序列化
【5月更文挑战第14天】Java序列化用于将对象转换为字节流，便于存储和网络传输。实现Serializable接口使类可被序列化，但可能引发隐私泄露、版本兼容性和性能问题。要避免这些问题，可使用transient关键字、控制serialVersionUID及考虑使用安全的序列化库。示例代码展示了如何序列化和反序列化对象，强调了循环引用和未实现Serializable的错误。理解并妥善处理这些要点对优化代码至关重要。
19 1
|
1天前

6 0
|
1天前
|

c++算法学习笔记 (8) 树与图部分
c++算法学习笔记 (8) 树与图部分
8 1
|
2天前
|

6 0
|
2天前

7 1
|
5天前
|

17 0
|
5天前
|

10 0
|
5天前
|

22 3
|
7天前
|

【5月更文挑战第18天】探索机器学习中的决策树算法，一种基于树形结构的监督学习，常用于分类和回归。算法通过递归划分数据，选择最优特征以提高子集纯净度。优点包括直观、高效、健壮和可解释，但易过拟合、对连续数据处理不佳且不稳定。广泛应用于信贷风险评估、医疗诊断和商品推荐等领域。优化方法包括集成学习、特征工程、剪枝策略和参数调优。
22 5
|
10天前
|

Python 数据结构和算法实用指南（四）（4）
Python 数据结构和算法实用指南（四）
19 1