class node:
def __init__(self, l, r, v):
self.left = l
self.right = r
self.val = v
node_7 = node(None, None, 7)
node_6 = node(None, None, 6)
node_5 = node(None, None, 5)
node_4 = node(None, None, 4)
node_3 = node(node_7, None, 3)
node_2 = node(node_5, node_6, 2)
node_1 = node(node_3, node_4, 1)
root = node(node_1, node_2, 'root')
''' 先中后遍历可以使用if not node:return null 这样就不用判断每个节点是否有左右孩子,因为是否左右孩子是null都压入栈 '''
# 1 先序遍历(根左右)
def first(root):
if not root:
return
print(root.val, '->', end='')
first(root.left)
first(root.right)
# first(root)
# 2 中序遍历(左根右边)
def mid_seq(root):
if root.left:
mid_seq(root.left)
print(root.val, '->', end='')
if root.right:
mid_seq(root.right)
# 3 后序遍历(左根右边)
def low_seq(root):
if root.left:
low_seq(root.left)
if root.right:
low_seq(root.right)
print(root.val, '->', end='')
# low_seq(root)
# 4 层次遍历(队列)
def levels(root):
queue = [root]
while queue:
if queue[0].left:
queue.append(queue[0].left)
if queue[0].right:
queue.append(queue[0].right)
print(queue.pop(0).val, '->', end='')
levels(root)
# 5 层次遍历(递归)
'''如果使用递归来写层次遍历,需要使用到一个数组,利用子节的下标是 2* i 和 2 * i+ 1 '''
list = [0,0,0,0,0,0,0,0] # 这个数组可以动态生成长度,每次生成的长度是上一层的一倍 1,2,4,8...... 这也符合二叉树的定律
def levels_oder(root, list, i):
if not root:
return
list[i-1] = root.val # 对应的下标格式化成对应的值 PS: insert插入若超过当前最大长度,会直接插入到最后一个元素中,无论你想插入到那里
levels_oder(root.left, list, 2 * i)
levels_oder(root.right, list, 2 * i + 1)
levels_oder(root, list, 1)
print(list)
二叉树的4种简单遍历
最新推荐文章于 2024-06-17 17:35:06 发布