题目:
给定一个 n 叉树的根节点 root
,返回 其节点值的 后序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null
分隔(请参见示例)。
/**
* 思路:从树的根节点开始向子节点进行遍历直到叶子节点,并且添加节点到栈中,然后将叶子节点
* 添加到ans中(ans为结果集合)。之后弹出栈顶元素,判断该元素是否有字节点,若有子节点,
* 开始遍历该子树,重复开始的操作。
*/
public class Solution {
//map是用来获取子节点的位置
Map<Node, Integer> map = new HashMap<>();
public List<Integer> postorder(Node root) {
Deque<Node> stack = new ArrayDeque<>();
List<Integer> ans = new ArrayList<>();
if (root == null) return ans;
Node node = root;
//遍历整个树,将节点加入到栈中,遍历到叶子节点后添加到结果集中
while (!stack.isEmpty() || node != null) {
//添加元素到栈中直到叶子节点
while (node != null) {
stack.push(node);
List<Node> children = node.children;
if (children != null && children.size() > 0) {
map.put(node,0);
node = children.get(0);
} else node = null;
}
//获取栈顶元素
node = stack.peek();
//用于或者子节点的位置
int index = map.getOrDefault(node,-1) + 1;
//获取该元素的子节点
List<Node> children = node.children;
//判断是否有子节点
if (children != null && children.size() > index) {
//存在子节点,添加到map中。
map.put(node,index);
//获取子节点
node = children.get(index);
} else {
//将叶子节点添加到结果中
ans.add(node.val);
//没有子节点,将此节点出栈
stack.pop();
//移除map中的记录
map.remove(node);
node = null;
}
}
return ans;
}
}
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;
}
};