一、给定一个 N 叉树,返回其节点值的前序遍历。
例如,给定一个 3叉树 :
返回其前序遍历: [1,3,5,6,2,4]。
说明: 递归法很简单,你可以使用迭代法完成此题吗?
思路:
1、递归法:利用栈将需要遍历的节点放入,随后从栈中取出一个节点,得到当前节点的值,并且将其children逆序添加到栈中,这样在出栈的时候,我们得到的节点顺序是正向的,符合前序遍历的要求。
2、迭代法:遍历每个子节点,对其进行前序遍历操作
解法一(递归)
/*
// 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 {
public List<Integer> preorder(Node root) {
LinkedList<Node> temp = new LinkedList<Node>();
LinkedList<Integer> res = new LinkedList<Integer>();
if(root == null) return res;
temp.add(root);
while(!temp.isEmpty()){
Node node = temp.pollLast();
res.add(node.val);
for(int i = node.children.size()-1;i>=0;i--){
temp.add(node.children.get(i));
}
}
return res;
}
}
解法二(迭代)
/*
// 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 {
LinkedList<Integer> res = new LinkedList<Integer>();
public List<Integer> preorder(Node root) {
vlr(root);
return res;
}
private void vlr(Node root){
if(root == null) return;
res.add(root.val);
for(int i = 0; i < root.children.size();i++){
vlr(root.children.get(i));
}
}
}
二、N叉树的后序遍历
思路:和前序遍历的思路类似,稍作改动即可
解法(迭代)
/*
// 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 {
LinkedList<Integer> res = new LinkedList<Integer>();
public List<Integer> postorder(Node root) {
lrd(root);
return res;
}
private void lrd(Node root){
if(root == null) return;
for(int i = 0; i < root.children.size();i++){
lrd(root.children.get(i));
}
res.add(root.val);
}
}