二叉树的前、中、后、层序遍历的递归实现

前中后序三种遍历方法对于左右结点的遍历顺序都是一样的(先左后右),唯一不同的就是根节点的出现位置。

1.前序:前序遍历指根结点在最前面输出,所以前序遍历的顺序是:中左右。

递归:
class Solution:
  def preorderTraversal(self, root): ##前序遍历
    """ :type root
      : TreeNode
      :rtype: List[int] """
    if not root: return []
    return [root.val] + self.inorderTraversal(root.left) + self.inorderTraversal(root.right)


循环
class Solution: def preorderTraversal(self, root): ## 前序遍历 stack = [] sol = [] curr = root while stack or curr: if curr: sol.append(curr.val) stack.append(curr.right) curr = curr.left else: curr = stack.pop() return sol

 

2.中序:对于中序遍历来说,根结点的遍历位置在中间,所以中序遍历的顺序:左中右。

递归
class Solution: def inorderTraversal(self, root): """ :type root: TreeNode :rtype: List[int] """ if not root: return [] return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)

循环
class Solution:
  def inorderTraversal(self, root):
    stack = []
    sol = []
    curr = root
    while stack or curr:
      if curr:
        stack.append(curr)
        curr = curr.left
      else:
        curr = stack.pop()
        sol.append(curr.val)
        curr = curr.right
    return sol

 

3.后序:后序遍历指根结点在最后面输出,所以后序遍历的顺序是:左右中。

递归
def postorderTraversal(self, root): ##后序遍历 
  """
  :type root
  : TreeNode
  :rtype: List[int]
  """
  if not root: return []
  return self.inorderTraversal(root.left) + self.inorderTraversal(root.right) + [root.val]

循环
def postorderTraversal(self, root): ## 后序遍历
  stack = []
  sol = []
  curr = root
  while stack or curr:
    if curr:
      sol.append(curr.val)
      stack.append(curr.left)
      curr = curr.right
    else:
      curr = stack.pop()
  return sol[::-1]

 

4.层序:层序遍历也可以叫做宽度优先遍历:先访问树的第一层结点,再访问树的第二层结点...然后一直访问到最下面一层结点。在同一层结点中,以从左到右的顺序依次访问。

 

递归
class Solution:
    def levelOrder(self, root):
        """
        :type root: TreeNode
        :rtype: List[List[int]]
        """
        def helper(node, level):
            if not node:
                return
            else:
                sol[level-1].append(node.val)
                if len(sol) == level:  # 遍历到新层时,只有最左边的结点使得等式成立
                    sol.append([])
                helper(node.left, level+1)
                helper(node.right, level+1)
        sol = [[]]
        helper(root, 1)
        return sol[:-1]

循环
class Solution:
  def levelOrder(self, root):
    if not root: return []
    sol = []
    curr = root
    queue = [curr]
    while queue:
      curr = queue.pop(0)
      sol.append(curr.val)
      if curr.left:
        queue.append(curr.left)
      if curr.right:
        queue.append(curr.right)
    return sol

PS:

Q:如果仍然按层遍历,但是每层从右往左遍历怎么办呢?

A:将上面的代码left和right互换即可

Q:如果仍然按层遍历,但是我要第一层从左往右,第二层从右往左,第三从左往右...这种zigzag遍历方式如何实现?

A:将sol[level-1].append(node.val)进行一个层数奇偶的判断,一个用append(),一个用insert(0,)

    if level%2==1:
        sol[level-1].append(node.val)
    else:
        sol[level-1].insert(0, node.val)

 

 

 

posted on 2021-04-16 14:53  不要挡着我晒太阳  阅读(266)  评论(0编辑  收藏  举报

导航