LeetCode 589. N 叉树的前序遍历

130 阅读1分钟

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叉树举例:

image.png

那么首先肯定是先将根节点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;
}

此题得解。