小知识,大挑战!本文正在参与“程序员必备小知识”创作活动
##实现二叉树的先序、中序和后序遍历
问题描述
给定一个二叉树,分别按照二叉树的先序、中序和后序打印所有节点。
要求:空间复杂度是O(n),时间复杂度是O(n)。
示例:
输入: [1,null,2,3]
1
\
2
/
3
输出: [[1,2,3],[1,3,2],[3,2,1]]
分析问题
拿到这个问题时,首先我们需要知道什么是先序遍历、中序遍历和后序遍历。
-
先序遍历:按照根节点 -> 左子树 -> 右子树的顺序来遍历这颗树,而访问左、右子树时,也采用同样的顺序进行遍历,直到遍历完整棵树。
-
中序遍历:按照左子树 -> 根节点 -> 右子树的顺序来遍历这棵树,而访问左、右子树时,也采取同样的顺序进行遍历,直到遍历完整颗树。
-
后续遍历:按照左子树 -> 右子树 -> 根结点的顺序来遍历这棵树,而访问左、右子树时,也采取同样的顺序进行遍历,直到遍历完整颗树。
根据二叉树的先序、中序、后序的定义,我们可以很直观的想到采用递归的方式来遍历整棵树。下面我们来看一下如何使用递归的方式实现二叉树的先序、中序和后序遍历。
递归
使用递归来遍历,当遇到根节点的左子树或右子树不为空时,我们就把它的左子树或右子树再当做一颗完整的树来处理。下面我们来看一下代码的实现。
为了方便理解,我们先看一下结点的定义。
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)