590. N 叉树的后序遍历

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

N叉树的后序遍历就不能用二叉树的逻辑了。因为他有N个叉,叉和叉之间没有关系,不能从一个找到另一个。
新思路:把一个节点的所有孩子,从右至左入栈。等孩子节点都打印完后,在打印根节点。之后出栈,这个出栈元素就是最左边的孩子。对这个孩子做重复的逻辑。直到节点没有孩子节点。该节点就是树结构中最左的节点。现在出栈,进行回溯。有一个问题了,就是不知道这个节点是主节点还是放进来的该节点的孩子节点。也就是说主节点要打印,而孩子节点就要重复上面的逻辑。举个例子:6出栈后,我不知道这个是什么角色,是该打印,还是找孩子节点。所以在放主节点时,就加入了一个标记,表示主节点的孩子已经全部入栈了,当找到这个标记时,直接打印就行了,这样就区分开了主节点和孩子节点。

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

        List<Integer> ret = new ArrayList<>();

        Stack<Node> stack = new Stack<>();

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

        while(!stack.isEmpty()) {
            cur = stack.pop();
            // 如果不是标记,说明是孩子节点,那么进行放孩子的操作
            if(cur != null) {
                // 由于是后序遍历,所以先放主节点,
                // 孩子节点从右至左一次发放栈。
                stack.push(cur);
                stack.push(null);

                for(int i=cur.children.size()-1;i>=0;i--) {
                    stack.push(cur.children.get(i));
                }


            } else {
                // 如果是标记节点,说明下一个是主节点,打印。
                cur = stack.pop();
                ret.add(cur.val);
            }
        }
        return ret;
        
    }

posted @ 2022-02-23 11:17  一颗青菜  阅读(0)  评论(0)    收藏  举报