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;