https://leetcode.com/problems/binary-tree-postorder-traversal/node
Given a binary tree, return the postorder traversal of its nodes' values.app
For example:post
Given binary tree {1,#,2,3},spa
1code
\blog
2遞歸
/leetcode
3get
return [3,2,1].it
Note: Recursive solution is trivial, could you do it iteratively?
後續遍歷二叉樹,要求不使用遞歸。
很明顯須要使用棧來進行迭代。後續遍歷是依序訪問左子樹,右子樹,根節點。咱們的入口是根節點,那麼咱們的棧應該先保存根,而後右子樹,再保存左子樹。
分開來看,根的左孩子有多是根而不是葉子結點,咱們須要一路向下保存根節點,直到遇到葉子結點,才能保證根最早保存。
怎麼樣保證右子樹比左子樹先保存呢?事實上咱們訪問的順序是先左後右。如今咱們只須要保證右子樹比根節點優先輸出(後入棧),而左子樹已所有出棧就能夠。怎麼判斷何時入棧(第一次遇到根(左孩子),第一次遇到右孩子),何時出棧(第二次遇到右孩子,第二次遇到根(左孩子))?咱們須要有一個pre變量來記錄以前遇到的最後一個節點。若是pre和當前節點的右孩子值相等,那麼咱們是第二次遇到根,此時右孩子早已訪問,直接根出棧。不然,咱們應訪訪問當前節點的右孩子(入棧)。
// C++ CODE:
class Solution { public: vector<int> postorderTraversal(TreeNode* root) { stack<TreeNode*> s; vector<int> result; while(root){ s.push(root); root = root->left; } while(!s.empty()){ TreeNode* tmp = s.top(); if(tmp->right){ if(result.empty()||tmp->right->val !=result[result.size()-1]){ TreeNode* tmproot = tmp->right; while(tmproot){ s.push(tmproot); tmproot = tmproot->left; } }else{ result.push_back(tmp->val); s.pop(); } }else{ result.push_back(tmp->val); s.pop(); } } return result; } };
# PYTHON CODE:
class Solution: # @param root, a tree node # @return a list of integers def postorderTraversal(self, root): stack, cur, pre, res = [], root, None, [] while cur or stack: if cur: stack.append(cur) cur = cur.left else: if stack[-1].right in (None, pre): res.append(stack[-1].val) pre = stack.pop() else: cur = stack[-1].right return res