二叉树的遍历(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]
posted @ 2020-12-23 22:44  爱睡觉的皮卡丘  阅读(218)  评论(0编辑  收藏  举报