Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
此题是N叉树的前序遍历问题,想必对于二叉树的前序遍历,大家都了如指掌了,那么N叉树无非就是多了几个孩子结点而已,递归解法如下:
public static List<Integer> preorder(Node root){
List<Integer> result = new ArrayList<>();
if(root == null){
return result;
}
// 输出根节点
result.add(root.val);
for(int i = 0;i < root.children.size();++i){
// 所有孩子节点按照从左到右的顺序依次递归
result.addAll(preorder(root.children.get(i)));
}
return result;
}
此题若是不使用递归解法,该如何求解呢?我们知道,在二叉树中,可以借助栈结构进行遍历,那么在N叉树中也是如此,不过有些许不同,以如下的一棵N叉树举例:
那么首先肯定是先将根节点1入栈,其次要将根结点弹出,再将其孩子节点入栈,而如果我们逆着顺序将其孩子节点入栈,那么栈中保存的元素为[3,2,4];下一次弹出的就是节点3,此时再将节点3的所有孩子节点逆序入栈,此时栈中元素为[5,6,2,4];紧接着弹出节点5,节点5没有孩子节点;继续弹出节点6,,节点6也没有孩子节点;然后弹出节点2;最后弹出节点4。发现了吗,这样似乎就实现了N叉树的前序遍历。
代码如下:
public static List<Integer> preorder(Node root) {
List<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
Stack<Node> stack = new Stack<>();
// 根结点入栈
stack.push(root);
while (!stack.isEmpty()) {
// 弹出栈顶节点
Node node = stack.pop();
result.add(node.val);
List<Node> children = node.children;
// 将当前节点的所有孩子节点逆序入栈
for (int i = children.size() - 1; i >= 0; --i) {
stack.push(children.get(i));
}
}
return result;
}
此题得解。