题目:
给定一个 N 叉树,返回其节点值的前序遍历。
Given an n-ary tree, return the preorder traversal of its nodes' values.
示例 1:
输入: root = [1,null,3,2,4,null,5,6]
输出: [1,3,5,6,2,4]
示例 2:
Nary-Tree input serialization is represented in their level order traversal, each group of children is separated by the null value (See examples).
输入: root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出: [1,2,3,6,7,11,14,4,8,12,5,9,13,10]
说明:
树的深度不会超过
1000
。树的节点总数不会超过
10000
。
Constraints:
The height of the n-ary tree is less than or equal to
1000
The total number of nodes is between
[0, 10^4]
进阶:
递归法很简单,你可以使用迭代法完成此题吗?
Follow up:
Recursive solution is trivial, could you do it iteratively?
解题思路:
N 叉树的前序, 中序, 后序遍历 本质上就是深度优先搜索的不同表现形式 , 既然是深度优先搜索, 那么理论上都可以用递归或栈迭代来解题. 详情可以看之前的文章:
递归法:
Java:
class Solution {
List<Integer> res = new ArrayList<>();
public List<Integer> preorder(Node root) {
if (root == null) // 基线条件
return res;
res.add(root.val); // 存储结点值
for (Node node : root.children) // 遍历所有子结点
preorder(node); // 递归子结点
return res;
}
}
Python:
class Solution:
def __init__(self):
self.res = list() # 初始化返回数组
def preorder(self, root: 'Node') -> List[int]:
if not root: # 基线条件
return self.res
self.res.append(root.val) # 存储结点值
for node in root.children: # 遍历子结点
self.preorder(node) # 递归子结点
return self.res
迭代法:
Java:
class Solution {
List<Integer> res = new ArrayList<>();
Stack<Node> stack = new Stack<>();
public List<Integer> preorder(Node root) {
if (root == null)
return res;
stack.add(root); // 根结点入栈
while (!stack.isEmpty()) { // 栈不空,遍历不止
Node node = stack.pop(); // 栈顶元素出栈
res.add(node.val); // 存储结点值
Collections.reverse(node.children); // 反转子结点
for (Node temp : node.children) // 遍历反转后的子结点
stack.add(temp); // 入栈
}
return res;
}
}
Python:
class Solution:
def preorder(self, root: 'Node') -> List[int]:
res = list()
if not root:
return res
stack = collections.deque() # 初始化双端队列
stack.append(root) # 根结点入栈
while stack: # 栈不空,遍历不止
node = stack.pop() # 栈顶元素出栈
res.append(node.val) # 存储结点值
if node.children:
for cld in node.children[::-1]: # 遍历反转后的子结点
stack.append(cld) # 入栈
return res