题目描述
给定一个 N 叉树,返回其节点值的前序遍历。
- 示例1:给定一个 3叉树 :
返回其前序遍历: [1,3,5,6,2,4]。
说明: 递归法很简单,你可以使用迭代法完成此题吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
思路一:递归法。原理比较简单,可直接看代码。
思路二:迭代法。利用栈,因为是前序遍历,因此最左边的孩子节点需要最后压入栈内以保证最先弹出栈,所以需要把孩子节点逆序压入栈。
代码详解
思路一:递归
/*
// Definition for a Node.
class Node {
public int val;
public List<Node> children;
public Node() {}
public Node(int _val) {
val = _val;
}
public Node(int _val, List<Node> _children) {
val = _val;
children = _children;
}
};
*/
class Solution {
List<Integer> list = new ArrayList<>();
public List<Integer> preorder(Node root) {
if(root == null) {
return list;
}
// 先在list里放入root.val
list.add(root.val);
// 再对其孩子进行递归
for(Node node : root.children) {
preorder(node);
}
return list;
}
}
思路二:迭代
class Solution {
public List<Integer> preorder(Node root) {
List<Integer> list = new ArrayList<>(); // 输出结果
Stack<Node> stack = new Stack<>(); // 栈
if(root == null) {
return list;
}
stack.push(root); // 先把根节点压入栈
// 循环体,直至栈为空
while(!stack.isEmpty()) {
Node node = stack.pop(); // 弹出栈顶元素
list.add(node.val); // 栈顶元素.val放入list中
Collections.reverse(node.children); // 逆序放入栈中,以保证最左边孩子节点最后压入栈内并最先弹栈
for(Node n : node.children) {
stack.push(n);
}
}
return list;
}
}
注意点
- 在迭代方法中,注意逆序入栈这一操作。
- 友情链接:第590题——N叉树的后序遍历。