LeetCode-二叉树前序遍历——D8【一般难度】

题目描述

Given a binary tree, return the preorder traversal of its nodes’ values.

Example:

Input: [1,null,2,3]
1

2
/
3

Output: [1,2,3]
Follow up: Recursive solution is trivial, could you do it iteratively?

算法思路

前序遍历采用“根左右”的顺序,如果采用递归则先打印出根节点,然后将当前节点的左节点作为根节点再次调用方法,最后将当前节点左右右节点再进行递归调用即可。

如果采用栈来进行迭代的话,栈不为空时,每次迭代应该将根节点出栈后,然后将右节点放入栈中,接着将左节点放入栈中。

算法实现

class TreeNode():
    def __init__(self,x):
        self.val=x
        self.left=None
        self.right=None
class Solution():
    #迭代方法
    def preorderTraversal(self,root):
        res=[]
        stack=[root]
        while stack:
            node=stack.pop()
            res.append(node.val)
            if node.right!=None :stack.append(node.right)
            if node.left!=None :stack.append(node.left)   
        
        return res
    #递归方法
    def preorderTraversal_r(self,root):
        res_r=[]
        if root:
            res_r.append(root.val)
            left =self.preorderTraversal_r(root.left)
            res_r.extend(left)
            right =self.preorderTraversal_r(root.right) 
            res_r.extend(right)
        return res_r
    
test=Solution()
n1=TreeNode(1)
n2=TreeNode(2)
n3=TreeNode(3)
n4=TreeNode(4)
n5=TreeNode(5)
n6=TreeNode(6)
n7=TreeNode(7)
n1.left=n2
n1.right=n3
n2.left=n4
n3.left=n5
n3.right=n6
n6.right=n7
"""
       1
      / \
     2   3
    /    /\
   4    5  6
            \
             7
"""
print(test.preorderTraversal(n1))
print(test.preorderTraversal_r(n1))

小结

在利用栈进行迭代的时候,应该先让右节点入栈,再让左节点入栈,这样才能保证出栈的顺序为先序遍历的顺序——“根左右”

发布了205 篇原创文章 · 获赞 655 · 访问量 53万+

猜你喜欢

转载自blog.csdn.net/qq_33414271/article/details/97823453