LeetCode 145 Binary Tree Postorder Traversal

題目

Given a binary tree, return the postorder traversal of its nodes' values.

Example:

Input: [1,null,2,3]

   1
    \
     2
    /
   3

Output: [3,2,1]

Follow up: Recursive solution is trivial, could you do it iteratively?


解法思路(一)

  • 借助棧;
  • 借助輔助類 Command;
關(guān)于輔助類 Command
  • 包裝了 TreeNode 和命令 c
  • 命令有兩種:goprint;
  • go 的話要把當(dāng)前節(jié)點(diǎn)的左右孩子入棧;
  • print 的話要就是遍歷到這個節(jié)點(diǎn)了,要把該節(jié)點(diǎn)放入遍歷的結(jié)果集;
關(guān)于棧的作用
  • 后序遍歷是這樣的:先遍歷左子樹,再遍歷右子樹,最后遍歷根;
  • 因?yàn)闂S羞@樣的特點(diǎn):先入棧的后出棧,所以最先要遍歷的節(jié)點(diǎn)最后入棧,最后要遍歷的節(jié)點(diǎn)最先入棧;
  • 棧有點(diǎn)像一個備忘錄,越后面要做的事情,越先放進(jìn)棧中,這樣只需一個個拿出棧頂?shù)氖虑樽?,就不會忘記最早要干的事情?/li>
  • 于遍歷來說,之后要遍歷的節(jié)點(diǎn)因之前被放進(jìn)棧中而被記起;

解法實(shí)現(xiàn)(一)

時間復(fù)雜度
  • O(n),n為樹的節(jié)點(diǎn)個數(shù);
空間復(fù)雜度
  • O(h),h為樹的高度,因?yàn)榍靶虮闅v屬于深度優(yōu)先遍歷,所以棧的深度最深為 h;
關(guān)鍵字

后序遍歷 非遞歸 輔助類 Command

實(shí)現(xiàn)細(xì)節(jié)
package leetcode._145;


import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

public class Solution145_1 {

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }

    private class Command {
        public String c;
        public TreeNode treeNode;
        public Command(String c, TreeNode treeNode) {
            this.c = c;
            this.treeNode = treeNode;
        }
    }

    public List<Integer> postorderTraversal(TreeNode root) {

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

        if (root == null) {
            return res;
        }

        Stack<Command> stack = new Stack<>();
        Command command = new Command("go", root);
        stack.push(command);

        while (!stack.isEmpty()) {
            command = stack.pop();

            if (command.c.equals("print")) {
                res.add(command.treeNode.val);
            } else {
                assert command.c.equals("go");
                stack.push(new Command("print", command.treeNode));
                if (command.treeNode.right != null) {
                    stack.push(new Command("go", command.treeNode.right));
                }
                if (command.treeNode.left != null) {
                    stack.push(new Command("go", command.treeNode.left));
                }
            }
        }

        return res;
    }

}

返回 LeetCode [Java] 目錄

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容