N-ary tree pre/post/level order traversal

Preorder:

/*
// 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 {
    public List<Integer> preorder(Node root) {
        List<Integer> res = new ArrayList<>();
        if (root == null) return res;
        LinkedList<Node> stack = new LinkedList<>();
        
        stack.push(root);
        
        while (!stack.isEmpty()) {
            Node cur = stack.pop();
            res.add(cur.val);
            int size = cur.children.size();
            for (int i = size - 1; i >= 0; i--) {
                if (cur.children.get(i) != null) stack.push(cur.children.get(i));
            }
        }
        return res;
    }
}

Post order:

class Solution {
    public List<Integer> postorder(Node root) {
        List<Integer> res = new ArrayList<>();
        if (root == null) return res;
        
        LinkedList<Node> stack = new LinkedList<>();
        
        stack.push(root);
        
        while (!stack.isEmpty()) {
            Node cur = stack.pop();
            res.add(0, cur.val);
            int size = cur.children.size();
             for (int i = 0; i < size; i++) {
                if (cur.children.get(i) != null) stack.push(cur.children.get(i));
            }
        }
        return res;
        
    }
}

Recursion of recursion:

class Solution {
    public List<Integer> postorder(Node root) {
        List<Integer> res = new ArrayList<>();
        if (root == null) return res;
        
        helper(root, res);
        return res;
        
    }
    
    private void helper(Node cur, List<Integer> res) {
        if (cur == null) return;
        
        int size = cur.children.size();
        for (int i = 0; i < size; i++) {
            helper(cur.children.get(i), res);
        }
        
        res.add(cur.val);
    }
}

Level order:
iterate:

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> res = new ArrayList<>();
        
        if (root == null) return res;
        
        Queue<Node> queue = new LinkedList<>();
        Node cur = root;
        queue.offer(cur);
        while (!queue.isEmpty()) {
            List<Integer> list = new ArrayList<>();
            int size = queue.size();
            for (int i = 0; i < size; i++) {
                cur = queue.poll();
                list.add(cur.val);
                int sizeOfChildren = cur.children.size();
                for (int j = 0; j < sizeOfChildren; j++) {
                    if (cur.children.get(j) != null) queue.offer(cur.children.get(j));
                }
            }
            res.add(list);
        }
        return res;
    }
}

recursive:

class Solution {
    public List<List<Integer>> levelOrder(Node root) {
        List<List<Integer>> res = new ArrayList<>();
        
        if (root == null) return res;
        
        helper(root, res, 0);
        return res;
    }
    
    private void helper(Node cur, List<List<Integer>> res, int level) {
        if (cur == null) return;
        
        if (res.size() <= level) {
            res.add(new ArrayList<>());
        }
        
        res.get(level).add(cur.val);
        
        int size = cur.children.size();
        for (int i = 0; i < size; i++) {
            helper(cur.children.get(i), res, level + 1);
        }
    }
}
posted @ 2020-11-04 00:41  EvanMeetTheWorld  阅读(24)  评论(0)    收藏  举报