二叉树前序遍历(即根左右可以用递归和迭代两种方式实现,其中递归书写简单,但时间复杂度较高,迭代则减少一定的运行时间。
示例1:
前序遍历的递归原理简单,即根据根左右的顺序,先按照前序遍历的方式遍历根结点,再遍历跟节点的左子树,最后遍历根结点的右子树,此过程通过换结点不断调用遍历函数即可。而迭代方法则相对复杂一点,考虑到要保留每一步回溯的根结点,需要设置一个栈结构,通过不断压入弹出结点实现对每个结点的左右结点的遍历。需要注意的是,出栈原则为先进后出,故需要先压入右结点再压入左结点其次是根结点,才能在弹出时实现先输出根结点接着左结点最后右结点的顺序。
代码:
递归法:
class Solution:
def preorderTraversal(self, root):
if root is None:
return []
return [root.val] + self.preorderTraversal(root.left) + self.preorderTraversal(root.right)
迭代法:
class Solution:
def preorderTraversal(self, root):
stack = []
result = []
if root is None:
return []
stack.append(root)
while(stack):
root = stack.pop()
result.append(root.val)
if root.right is not None:
stack.append(root.right)
if root.left is not None:
stack.append(root.left)
return result