题目:
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?
解题思路:用两个栈,一个保存节点,另一个保存访问次数,如果第三次访问,则可以把其值加入到vector中,第一次访问时作为其父亲的子节点,加入到栈中,第二次访问时作为父亲,把其孩子加入到栈中,第三次就表示其孩子都访问完了,现在终于轮到他被访问了。《leetcode题解》上只用了一个栈和一个变量,比较节省空间。
用两个栈的代码:
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
vector<int> postorderTraversal(TreeNode *root)
{
vector<int> result;
if(root==NULL)
return result;
stack<TreeNode *> s;
s.push(root);
stack<int> flag;
flag.push(0);
while(!s.empty())
{
flag.top()++;
TreeNode *temp=s.top();
if(flag.top()==2)
{
result.push_back(s.top()->val);
flag.pop();
s.pop();
continue;
}
if(temp->right!=NULL)
{
s.push(temp->right);
flag.push(0);
}
if(temp->left!=NULL)
{
s.push(temp->left);
flag.push(0);
}
}
return result;
}
int main()
{
TreeNode *root=new TreeNode(1);
root->left=new TreeNode(2);
root->right=new TreeNode(3);
root->left->left=new TreeNode(4);
root->right->right=new TreeNode(5);
vector<int> result=postorderTraversal(root);
system("pause");
return 0;
}
《leetcode题解》中用一个栈的代码:
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
struct TreeNode
{
int val;
TreeNode *left;
TreeNode *right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
vector<int> postorderTraversal(TreeNode *root)
{
vector<int> result;
if(root==NULL)
return result;
stack<TreeNode *> s;
TreeNode *curr=root;
while(curr!=NULL)
{
s.push(curr);
curr=curr->left;
}
TreeNode *prev=NULL;//保存上一次访问的节点
while(!s.empty())
{
curr=s.top();
if(curr->right==prev)//如果上次访问的是右子树,则现在可以访问根节点
{
result.push_back(curr->val);
s.pop();
prev=curr;
}
else
{
curr=curr->right;
while(curr!=NULL)
{
s.push(curr);
curr=curr->left;
}
prev=NULL;
}
}
return result;
}
int main()
{
TreeNode *root=new TreeNode(1);
root->left=new TreeNode(2);
root->right=new TreeNode(3);
root->left->left=new TreeNode(4);
root->left->right=new TreeNode(5);
root->left->left->right=new TreeNode(7);
root->left->right->right=new TreeNode(6);
vector<int> result=postorderTraversal(root);
system("pause");
return 0;
}