地址:http://oj.leetcode.com/problems/binary-tree-postorder-traversal/
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?
思路:递归比较简单。非递归太难了。真是后悔当年本科的时候没好好练。出来混迟早要还的。非递归WA不下20次吧。
非递归参考代码:
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int>ans;
if(!root)
return ans;
stack<TreeNode*>st;
st.push(root);
while(!st.empty())
{
if(st.top()->left != root)
{
while(root->left)
{
root = root->left;
st.push(root);
}
}
else
{
root = st.top();
}
if(root->right)
{
root = root->right;
st.push(root);
}
//deal with leaf node
else
{
ans.push_back(root->val);
st.pop();
if(!st.empty() && st.top()->right==root)
{
while(!st.empty() && st.top()->right==root)
{
root = st.top();
st.pop();
ans.push_back(root->val);
}
}
if(!st.empty() && st.top()->left==root)
{
while(!st.empty() && st.top()->left==root && !st.top()->right)
{
root = st.top();
st.pop();
ans.push_back(root->val);
}
if(!st.empty() && st.top()->right == root)
{
while(!st.empty() && st.top()->right==root)
{
root = st.top();
st.pop();
ans.push_back(root->val);
}
//ans.push_back(root->val);
}
else if(!st.empty() && st.top()->right)
{
root = st.top()->right;
st.push(root);
}
}
}
}
return ans;
}
};
递归参考代码:
class Solution {
public:
vector<int> ans;
vector<int> postorderTraversal(TreeNode *root) {
if(!root)
return this->ans;
if(root->left)
postorderTraversal(root->left);
if(root->right)
postorderTraversal(root->right);
this->ans.push_back(root->val);
return this->ans;
}
};