N叉树的后序遍历(3种实现)

N叉树的后序遍便


题目

N叉树的后序遍历(力扣:590)

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

分析

后续遍历,即先输出孩子节点,后输出跟节点。

我们可以使用递归和遍历两种方式来实现:

递归:用一个全局List来保存结果,从跟节点遍历,如果节点有孩子,则递归孩子节点,最后将节点添加到List中,递归完成后返回list即可。

遍历:使用辅助栈来实现,首先将第一个元素添加到栈,当栈不为空时,弹出栈顶元素,将元素值添加到结果队列中,然后将该点的所有孩子入栈。循环遍历到栈为空为止。这时,得到的结果队列的逆序即为后续遍历结果。

代码实现:递归

    /**
     * 590. N叉树的后序遍历
     */
    private List<Integer> list = new ArrayList<>();
    public List<Integer> postorder(Node root) {
        if(root == null){
            return list;
        }
        dfs(root);
        return list;

    }
    private void dfs(Node root){
        if(root == null){
            return;
        }
        for(int i=0 ;i< root.children.size(); i++){
            dfs(root.children.get(i));
        }
        list.add(root.val);
    }

代码实现:遍历

遍历,最后逆序即可:

    /**
     * 590. N叉树的后序遍历
     * @param root
     * @return
     */
    public List<Integer> postorder2(Node root) {
        List<Integer> list = new ArrayList<>();
        if(root == null){
            return list;
        }
        Stack<Node> stack = new Stack<>();
        stack.push(root);
        Node tmp;
        while (!stack.isEmpty()){
            tmp = stack.pop();
            list.add(tmp.val);
            for (int i=0;i<tmp.children.size(); i++){
                stack.push(tmp.children.get(i));
            }
        }
        Collections.reverse(list);
        return list;
    }

遍历,将结果添加到第二个辅助栈中,最后将栈元素添加到结果队列,实现逆序:

    /**
     * 590. N叉树的后序遍历
     * @param root
     * @return
     */
    public List<Integer> postorder3(Node root) {
        List<Integer> list = new ArrayList<>();
        if(root == null){
            return list;
        }
        Stack<Node> stack = new Stack<>();
        Stack<Node> all = new Stack<>();
        stack.push(root);
        Node tmp;
        while (!stack.isEmpty()){
            tmp = stack.pop();
            all.push(tmp);
            for (int i=0;i<tmp.children.size(); i++){
                stack.push(tmp.children.get(i));
            }
        }
        while(!all.isEmpty()){
            list.add(all.pop().val);
        }
        return list;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章