[LeetCode] 145. Binary Tree Postorder Traversal

題目鏈接: https://leetcode.com/problems/binary-tree-postorder-traversal/description/

Description

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

For example:
Given binary tree {1,#,2,3},

    1
     \
      2
     /
    3

return [3,2,1].

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

解題思路

遞歸的方式很簡單,但是這道題要求用非遞歸的方式,那麼自然想到的就是用棧來解決。由於後序遍歷的順序是 左節點->右節點->根,所以可以先一直沿着左節點往下直到NULL,將這條路徑上的所有節點依次放入棧(nStack)中。同時用另一個棧(vStack),爲每一個節點保存狀態值,用於彈出棧頂時以辨別是否遍歷過其右節點,初始值爲false。若已經遍歷過其右節點,則同時彈出兩個棧的棧頂,並將該節點的值存入返回數組中;若未遍歷其右節點,則暫時不彈出,修改 vStack 的棧頂爲true,表示已訪問過其右節點,並與之前一樣,此時的根節點應爲該節點的右節點,沿着新的根節點的左節點一直遍歷至NULL,重複該過程。

Code

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        stack<TreeNode*> nStack;
        stack<bool> vStack;

        while (root != NULL) {
            nStack.push(root);
            vStack.push(false);
            root = root->left;
        }

        while (!nStack.empty()) {
            root = nStack.top();

            if (vStack.top()) {
                res.push_back(root->val);
                nStack.pop();
                vStack.pop();
            } else {
                vStack.top() = true;
                root = root->right;

                while (root != NULL) {
                    nStack.push(root);
                    vStack.push(false);
                    root = root->left;
                }
            }
        }
        return res;
    }
};
發佈了60 篇原創文章 · 獲贊 18 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章