二叉樹後序遍歷-非遞歸算法
阿新 • • 發佈:2019-02-25
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).如果二叉樹結點的值是數值,那麽求每條路徑上值之和,也可以利用二叉樹後序遍歷的非遞歸算法這個特性
二叉樹後序遍歷-非遞歸算法