方法一:
先找最左孩子,只有最左孩子同时是叶子节点,才是目标节点,否则迭代最左孩子的右孩子。
class Solution { public: vector<int> postorderTraversal(TreeNode* root) { vector<int> vt; stack<TreeNode*> st; if(root==NULL) return vt; while(root!=NULL||!st.empty()) { while(root) { if(!st.empty()&&st.top()==root) break; st.push(root); root=root->left; st.top()->left=NULL; } if(!st.empty()) { root=st.top(); if(root->right) { root=root->right; st.top()->right=NULL; } else { vt.push_back(root->val); st.pop(); if(!st.empty()) root=st.top(); else root=NULL; } } } return vt; } };方法2:后序遍历的顺序是left -right-root;现在的出栈顺序是root ,right,left。将结果翻转即可
class Solution { public: vector<int> postorderTraversal(TreeNode* root) { vector<int> vt; stack<TreeNode*> st; if(!root) return vt; st.push(root); while(!st.empty()) { root=st.top(); st.pop(); vt.push_back(root->val); if(root->left)st.push(root->left); if(root->right)st.push(root->right); } reverse(vt.begin(), vt.end()); return vt; } };