589. N 叉树的前序遍历

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

多叉树和二叉树的思路是一样的。都是缓存后遍历的。

    public List<Integer> preorder(Node root) {

        List<Integer> ret = new ArrayList<>();
        Stack<Node> stack = new Stack<>();

        Node cur = root;

        while(cur != null || !stack.isEmpty()) {
            if(cur != null) {
                stack.push(cur);
            }
            cur = stack.pop();
            ret.add(cur.val);
            List<Node> nodes = cur.children;
            for(int i=nodes.size()-1;i>0;i--) {
                stack.push(nodes.get(i));
            }
            cur = nodes.size() == 0 ? null : nodes.get(0);
        }
        return ret;
    }

当然如果这样不好理解,还可以先将根节点入栈,之后从后向前一次入栈:

    public List<Integer> preorder(Node root) {
        if(root == null) {
            return new ArrayList<>();
        }
        List<Integer> ret = new ArrayList<>();

        Deque<Node> stack = new ArrayDeque<>();


        Node cur = root;
        stack.push(cur);

        while(!stack.isEmpty()) {
            cur = stack.pop();
            ret.add(cur.val);
            // 孩子节点从右至左依次入栈
            for(int i=cur.children.size()-1;i>=0;i--) {
                stack.push(cur.children.get(i));
            }

        }
        return ret;

        
    }
posted @ 2022-02-22 22:59  一颗青菜  阅读(2)  评论(0)    收藏  举报