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

651 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动

##实现二叉树的先序、中序和后序遍历

问题描述

给定一个二叉树,分别按照二叉树的先序、中序和后序打印所有节点。

要求:空间复杂度是O(n),时间复杂度是O(n)。

示例:

输入: [1,null,2,3]  
   1
    \
     2
    /
   3 

输出: [[1,2,3],[1,3,2],[3,2,1]]

分析问题

拿到这个问题时,首先我们需要知道什么是先序遍历、中序遍历和后序遍历。

  1. 先序遍历:按照根节点 -> 左子树 -> 右子树的顺序来遍历这颗树,而访问左、右子树时,也采用同样的顺序进行遍历,直到遍历完整棵树。

  2. 中序遍历:按照左子树 -> 根节点 -> 右子树的顺序来遍历这棵树,而访问左、右子树时,也采取同样的顺序进行遍历,直到遍历完整颗树。

  3. 后续遍历:按照左子树 -> 右子树 -> 根结点的顺序来遍历这棵树,而访问左、右子树时,也采取同样的顺序进行遍历,直到遍历完整颗树。

根据二叉树的先序、中序、后序的定义,我们可以很直观的想到采用递归的方式来遍历整棵树。下面我们来看一下如何使用递归的方式实现二叉树的先序、中序和后序遍历。

递归

image.png

使用递归来遍历,当遇到根节点的左子树或右子树不为空时,我们就把它的左子树或右子树再当做一颗完整的树来处理。下面我们来看一下代码的实现。

为了方便理解,我们先看一下结点的定义。

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right

先序遍历

    def preorder(self,root):
        if not root:
            return
        self.res.append(root.val)
        self.preorder(root.left)
        self.preorder(root.right)

中序遍历

    def inorder(self,root):
        if not root:
            return
        self.inorder(root.left)
        self.res.append(root.val)
        self.inorder(root.right)

后续遍历

    def postorder(self, root):
        if not root:
            return
        self.postorder(root.left)
        self.postorder(root.right)
        self.res.append(root.val)

代码的完整实现

class Solution:
    res=[]
    def threeOrders(self, root):
        result = []
        self.preorder(root)
        result.append(self.res[:])
        self.res.clear()
        self.inorder(root)
        result.append(self.res[:])
        self.res.clear()
        self.postorder(root)
        result.append(self.res[:])
        self.res.clear()
        return result
        
    def postorder(self, root):
        if not root:
            return
        self.postorder(root.left)
        self.postorder(root.right)
        self.res.append(root.val)

    def preorder(self,root):
        if not root:
            return
        self.res.append(root.val)
        self.preorder(root.left)
        self.preorder(root.right)

    def inorder(self,root):
        if not root:
            return
        self.inorder(root.left)
        self.res.append(root.val)
        self.inorder(root.right)