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;
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章