欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

589. N叉树的前序遍历(python)(递归法与迭代法)

程序员文章站 2022-04-27 11:25:57
...

给定一个N叉树,返回其节点值的前序遍历

例如,给定一个 3叉树 :

589. N叉树的前序遍历(python)(递归法与迭代法)

返回其前序遍历: [1,3,5,6,2,4]

说明: 递归法很简单,你可以使用迭代法完成此题吗?


解法一:递归法(简单)

递归法很简单:先是根节点,然后是前序遍历第一个子结点、前序遍历第二个子结点……不断调用自身函数来达成前序遍历。

"""
# Definition for a Node.
class Node(object):
    def __init__(self, val, children):
        self.val = val
        self.children = children
"""
class Solution(object):
    def preorder(self, root):
        """
        :type root: Node
        :rtype: List[int]
        """
        if not root:
            return [];
        if not root.children:
            return [root.val];
        result = [root.val];
        for child in root.children:
            result += self.preorder(child);
        return result;

解法二:迭代法(中等)

迭代法即使用循环,循环结束时,输出结果。典型的迭代法为二叉树的层序遍历,使用队列来保存节点。 

这里是前序遍历,按照根节点、子结点从左到右的顺序进行遍历,如若像层序遍历那样使用队列,那么兄弟节点必然会紧挨着彼此,不行,考虑使用栈试试看,栈的先进后出,让兄弟节点的顺序颠倒,但其可以保证以每个兄弟节点为根节点的子树相互独立,兄弟节点不会相连,例如出栈一个节点,立刻将此节点的所有子结点入栈。所以栈完美满足要求。只需要将子结点入栈时,将子结点反转顺序即可。

python 中的栈可以用list 列表来完成。

入栈: list.append(something)

出栈:node = list.pop()

反转列表:list.reverse()  注意反转列表,是对列表本身进行操作,并不返回任何值。

"""
# Definition for a Node.
class Node(object):
    def __init__(self, val, children):
        self.val = val
        self.children = children
"""
class Solution(object):
    def preorder(self, root):
        """
        :type root: Node
        :rtype: List[int]
        """
        if not root:
            return [];
        stack = [];
        result = [];
        stack.append(root);
        while stack:
            curr = stack.pop();
            result.append(curr.val);
            if curr.children:
                curr.children.reverse();
                stack += curr.children;
        return result;