目录
一、二叉树
1.二叉树的创建
比如要创建下图所示二叉树:
# 节点类
class TreeNode:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
# 左节点和右节点默认为空
def __str__(self):
return self.data
def createBinaryTree():
A, B, C, D, E, F, G, H, I = [TreeNode(x) for x in 'ABCDEFGHI']
'''
相当于:
A = TreeNode('A')
B = TreeNode('B')
...
'''
A.left = B
A.right = C
B.right = D
C.left = E
C.right = F
E.left = G
F.left = H
F.right = I
return A
2.二叉树的遍历(先序+中序+后序+层序)
-
图文理解
数据结构——二叉树先序、中序、后序及层次四种遍历(C语言版)_正弦定理的博客-CSDN博客_中序遍历
推荐参考这位作者的图文讲解,感谢大佬~
-
代码实现
from collections import deque # 双端队列
# 节点类
class TreeNode:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
# 左节点和右节点默认为空
def __str__(self):
return self.data
# 创建二叉树
def createBinaryTree():
A, B, C, D, E, F, G, H, I = [TreeNode(x) for x in 'ABCDEFGHI']
'''
相当于:
A = TreeNode('A')
B = TreeNode('B')
...
'''
A.left = B
A.right = C
B.right = D
C.left = E
C.right = F
E.left = G
F.left = H
F.right = I
return A
# 先序遍历(递归)
def preOrder(node, res=[]): # 节点
if node: # node is not None
res.append(node.data)
preOrder(node.left)
preOrder(node.right)
return res
# 中序遍历(递归)
def inOrder(node, res=[]):
if node:
inOrder(node.left)
res.append(node.data)
inOrder(node.right)
return res
# 后序遍历(递归)
def postOrder(node, res=[]):
if node:
postOrder(node.left)
postOrder(node.right)
res.append(node.data)
return res
# 先序遍历(迭代)
def preorderIter(root, res=[]):
stack = [] # 栈:记录访问过的根节点
node = root
while True:
while node:
res.append(node.data)
stack.append(node)
node = node.left
if not stack: # 如果栈为空
break
node = stack.pop().right # 访问被弹出节点的右节点
return res
# 中序遍历(迭代)
def inOrderIter(node, res=[]):
pass
# https://www.bilibili.com/video/BV15f4y1W7i2/?spm_id_from=333.788&vd_source=95585215c756caf0d30065463e625a78
# 后序遍历(迭代)
def postOrderIter(node, res=[]):
pass
# 层序遍历 https://www.bilibili.com/video/BV15f4y1W7i2/?spm_id_from=333.788&vd_source=95585215c756caf0d30065463e625a78
def levelOrder(root, res=[]):
queue = deque([root]) # (双端)队列
while queue:
node = queue.popleft()
res.append(node.data)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return res
if __name__ == '__main__':
root = createBinaryTree() # 根节点
print(preOrder(root))
print(inOrder(root))
print(postOrder(root))
print(preorderIter(root))
print(levelOrder(root))
二、AcWing 1497. 树的遍历(每日一题)
1.题目描述
2.思路分析
1.通过中后序列构造二叉树(递归) 2.层序遍历二叉树
3.代码实现
from collections import deque
N = int(input())
postOrder = list(map(int, input().split()))
inOrder = list(map(int, input().split()))
class TreeNode:
def __init__(self, data):
self.data = data
self.left = None
self.right = None
def buildTree(inOrder, postOrder):
if not postOrder: # postOrder == []
return None
root = TreeNode(postOrder[-1])
rootIndexIn = inOrder.index(root.data)
inOrder_left = inOrder[:rootIndexIn]
inOrder_right = inOrder[rootIndexIn + 1:]
postOrder_left = postOrder[:rootIndexIn]
postOrder_right = postOrder[rootIndexIn:-1]
root.left = buildTree(inOrder_left, postOrder_left)
root.right = buildTree(inOrder_right, postOrder_right)
return root
def levelOrder(root, res=[]):
queue = deque([root])
while queue:
node = queue.popleft()
res.append(node.data)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return ' '.join(map(str, res))
print(levelOrder(buildTree(inOrder, postOrder)))
如有不足或不解之处欢迎留言指正哈。
如有帮助可以点赞收藏嘛,感谢~