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

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

例如,给定一个 3叉树 :

返回其前序遍历: [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;

猜你喜欢

转载自blog.csdn.net/romeo12334/article/details/81451698