1. 程式人生 > >二叉樹後序遍歷-非遞歸算法

二叉樹後序遍歷-非遞歸算法

else postorder nbsp return () pop 入棧 我們 二叉樹

從根結點開始,將所有最左結點全部壓棧,每當一個結點出棧時,都先掃描該結點的右子樹,只有當一個結點的左孩子和右孩子結點均被訪問過了,才能訪問結點自身。

非遞歸算法實現如下:

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode * right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

vector<int> postorderTraversal(TreeNode* root) {
        vector
<int> path; stack<TreeNode *> st; TreeNode * pre = NULL; bool leftTag; do { //root及其所有的左子樹全部入棧 while (root != NULL) { st.push(root); root = root->left; } leftTag
= true; // leftTag = ture, 說明左子樹為NULL或者已經全部被訪問 pre = NULL; // while (!st.empty() && leftTag) { root = st.top(); if (root->right == pre) { //訪問棧頂元素 path.push_back(root->val);
//出棧 st.pop(); pre = root; } else { leftTag = false; root = root->right; } } } while (!st.empty()); return path; }

後序非遞歸算法的特性是:就是當訪問某個結點時,棧中所保存的元素

正好是這個結點的所有祖先。那麽知道了這個特性,我們就很容易解決下面如下問題:

(1).當給定一個葉子結點,要求輸出該葉子結點的所有祖先

(2).輸出根結點到所有葉子結點的路徑

(3).如果二叉樹結點的值是數值,那麽求每條路徑上值之和,也可以利用二叉樹後序遍歷的非遞歸算法這個特性

二叉樹後序遍歷-非遞歸算法