N 叉树的后序遍历
描述:给定一个 n 叉树的根节点 root ,返回 其节点值的 后序遍历 。n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
示例 1:
输入:root = [1,null,3,2,4,null,5,6]
输出:[5,6,3,2,4,1]
示例 2:
输入: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]
输出:[2,6,14,11,7,3,12,8,4,13,9,10,5,1]
限制:
-
节点总数在范围
[0, 104]
内 -
0 <= Node.val <= 104
-
n 叉树的高度小于或等于
1000
解法1:递归
二叉树的后序遍历顺序为
左->右->根
,同样推广到N叉树,遍历顺序为第一个孩子->第二个孩子->....->第n个孩子节点(如果存在的话)->根
则递归解法的步骤为:
-
1.传入父节点
-
2.遍历孩子节点
-
3.将当前递归调用栈中的节点值加入结果集中
/* // 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 { private List<Integer> ans = new ArrayList<Integer>(); public void dfsPostOrder(Node root){ if(root==null) return; for(Node child:root.children){ dfsPostOrder(child); } ans.add(root.val); return; } public List<Integer> postorder(Node root) { dfsPostOrder(root); return ans; } }
解法2:前序反转
二叉树的后序遍历顺序为
左->右->根
,前序遍历为根->左->右
,此时如果使用栈,先将父节点压栈,出栈父节点,从左到右压栈子节点,就可达到根->右->左
的访问顺序,最后反转结果集,达到左->右->根
的访问效果,同理可以推广到N叉树的情况。则前序反转的步骤为:
- 1.压栈父节点
- 2.当栈非空,出栈父节点,将父节点值添加到结果集中,从左到右一次压栈子节点
- 3.将结果集反转,返回作为答案
-
class Solution {
public List<Integer> postorder(Node root) {
List<Integer> res = new ArrayList<>();
if (root == null) {
return res;
}
Deque<Node> stack = new ArrayDeque<Node>();
stack.push(root);
while (!stack.isEmpty()) {
Node node = stack.pop();
res.add(node.val);
for (Node item : node.children) {
stack.push(item);
}
}
Collections.reverse(res);
return res;
}
}