二叉树的遍历(python实现)
一、层序遍历
1.使用队列实现
输入根节点,使用队列来遍历。先进的节点会先出去,出去时将自己的子节点放到队列中。
def level(root):
if not root:
return None
queue=[root]
res=[]
while queue:
node = queue.pop(0)
res.append(node)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return res
2.使用递归实现
result = []
def add_to_result(level, node):
if not node:
return None
if level > len(result) - 1:
result.append([]) #到达新的一层的开头,要初始化一层
result[level].append(node.val)
add_to_result(level+1, node.left)
add_to_result(level+1, node.right)
add_to_result(0, root)
return result
二、前序遍历
1.递归
遍历顺序:根--左子树--右子树
res=[]
def preorder(root):
if not root:
return None
res.append(root.val)
preorder(root.left)
preorder(root.right)
2.迭代
使用栈,先进后出,遍历左节点,知道叶子节点。然后出栈,遍历上一级的右节点,然后再出.......
res = [ ]
stack = []
node = root
while res or len(stack)>0:
while node:
stack.append(node)
res.append(node.val)
node = node.left
node = stack.pop()
node = node.right
三、中序遍历
1.递归
遍历顺序:左子树--根--右子树
res=[]
def midorder(root):
if not root:
return None
midorder(root.left)
res.append(root.val) #调用顺序更改一下
midorder(root.right)
2.迭代
res = [ ]
stack = []
node = root
while res or len(stack)>0:
while node:
stack.append(node)
node = node.left #到达最深的左节点
node = stack.pop()
res.append(node.val) #出栈后再加入结果
node = node.right
四、后序遍历
1.递归
遍历顺序:左子树--右子树--根
res=[]
def postorder(root):
if not root:
return None
postorder(root.left)
postorder(root.right)
res.append(root.val)
postorder(root)
2.迭代
和前序遍历思路一样,不过先遍历右子树,最后将结果逆序
res=[]
stack = []
node = root
if not root:
return None
while node or len(stack)>0:
while node:
stack.append(node)
res.append(node.val)
node = node.right
node = stack.pop()
node = node.left
return res[::-1]