【数据结构】二叉树:LeetCode题(二)589. N叉树的前序遍历,590. N叉树的后序遍历,429. N叉树的层序遍历

239 阅读1分钟

在上一篇 二叉树的LeetCode题(一):94. 二叉树的中序遍历,144. 二叉树的前序遍历,145. 二叉树的后序遍历,102. 二叉树的层序遍历 中我们看到了LeetCode中关于二叉树的基本问题,本篇我们就来看看N叉树的基本问题。

589. N叉树的前序遍历¹

给定一个 N 叉树,返回其节点值的前序遍历

例如,给定一个 3叉树 :

img

返回其前序遍历: [1,3,5,6,2,4]

解法一:递归

class Solution {
    public List<Integer> preorder(Node root) {
        List<Integer> res = new ArrayList<>();
        dfs(root, res);
        return res;
    }

    public void dfs(Node root, List<Integer> res) {
        if(root == null) return;
        res.add(root.val);
        for(Node node : root.children) 
        	dfs(node,res);
    }
}

解法二:迭代*

public List<Integer> preorder(Node root) {
        
        List<Integer> res = new ArrayList<>();
        Stack<Node> stack = new Stack<>();
        
        stack.add(root);
        while (!stack.empty()) {
            root = stack.pop();
            res.add(root.val);
            for (int i = root.children.size() - 1; i >= 0; i--)
                stack.add(root.children.get(i));
        }
        
        return res;
    }

590. N叉树的后序遍历¹

给定一个 N 叉树,返回其节点值的后序遍历

例如,给定一个 3叉树 :

img

返回其后序遍历: [5,6,3,2,4,1].

解法一:递归

class Solution {
    public List<Integer> postorder(Node root) {
        List<Integer> res = new ArrayList<>();
        postOrder(root,res);
        return res;
    }

    private void postOrder(Node root,List<Integer> res) {
        if (root == null) return;
        for (Node node : root.children) postOrder(node,res);
        res.add(root.val);
    }
}

解法二:迭代*

public List<Integer> postorder(Node root) {
        
        List<Integer> res = new ArrayList<>();
        Stack<Node> stack = new Stack<>();
        
        stack.add(root);
        while(!stack.isEmpty()) {
            root = stack.pop();
            res.add(root.val);
            for(Node node: root.children)
                stack.add(node);
        }
        Collections.reverse(list);
        return res;
    }

429. N叉树的层序遍历²

给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。

例如,给定一个 3叉树 :

img

返回其层序遍历:

[
     [1],
     [3,2,4],
     [5,6]
]

解法:BFS

public List<List<Integer>> levelOrder(Node root) {
        if (root == null) return new ArrayList<>();
        
        Queue<Node> queue = new LinkedList<>();
        queue.offer(root);
        List<List<Integer>> res = new ArrayList<>(); 

        while (!queue.isEmpty()) {
            List<Integer> list = new ArrayList<>();
            int size = queue.size();
            for (int i = 0; i < size; i++) { 
                Node node = queue.poll();
                list.add(node.val);
                if (node.children != null)
                    for (Node n : node.children) 
                        queue.offer(n);
            }
            res.add(list);
        }
        return res;
}