589. N 叉树的前序遍历

589. N 叉树的前序遍历

java1:stack栈:没看懂

class Solution {
    public List<Integer> preorder(Node root) {
        List<Integer> res = new ArrayList<Integer>();
        if (root == null) {
            return res;
        }
        Map<Node, Integer> map = new HashMap<Node, Integer>();
        Deque<Node> stack = new ArrayDeque<Node>();
        Node node = root;
        while (!stack.isEmpty() || node != null) {
            while (node != null) {
                res.add(node.val);  // 添加入res
                stack.addFirst(node);
                List<Node> children = node.children;
                if (children != null && children.size() > 0) {
                    map.put(node, 0);
                    node = children.get(0);  // 一直往左侧延伸,所以一直get(0)
                } else {
                    node = null;
                }
            }
            node = stack.peekFirst();
            int index = map.getOrDefault(node, -1) + 1;  // 当前节点map-get一次,遍历一个分支!
            List<Node> children = node.children;  // 延伸到最左下边,然后check右侧的节点
            if (children != null && children.size() > index) {  // node移至右侧一个节点,然后再循环往左下延伸!
                map.put(node, index);
                node = children.get(index);
            } else {  // 子节点不存在 || children使用结束,那么当前node就应该删除、并且node==null,不进入下一个while,进入右侧下一个节点
                stack.removeFirst();
                map.remove(node);
                node = null;  // 不进入下一次while
            }
        }
        return res;
    }
}

java2:DFS

class Solution {
    List<Integer> list = new ArrayList<>();
    private void dfs(Node root) {
        if (root == null) {
            return;
        }
        list.add(root.val);
        for (Node child : root.children) {
            dfs(child);
        }
    }
    public List<Integer> preorder(Node root) {
        dfs(root);
        return list;
    }
}

你可能感兴趣的:(LeetCode刷题,深度优先,算法)