问题描述
求给定的二叉树的后序遍历。
例如:
给定的二叉树为{1,#,2,3},
返回[3,2,1].
备注;用递归来解这道题太没有新意了,可以给出迭代的解法么?
解决方案
二叉树的前中后遍历使用递归实现很简单。
class Solution {
public:
vector<int> returnList;
vector<int> postorderTraversal(TreeNode *root) {
postOrder(root);
return returnList;
}
void postOrder(TreeNode *root){
if(root->left!=NULL)postOrder(root->left);
if(root->right!=NULL)postOrder(root->right);
returnList.push_back(root->val);
}
};
但这道题使用递归会超出,因此配合栈使用非递归。
- 将根结点入栈,使用一个pre记录上次出栈的结点(上次出栈的结点一定为当前访问结点的左右子结点,因为后续遍历先访问左右子结点,这就是pre!=NULL &&(pre== temp->left || pre==temp->right)的巧妙之处)
- 出栈的条件:当前访问的结点不存在子结点或者当前结点的左右子结点都被访问过。
- 入栈:若有子结点,先入右子结点再入左子结点,这样就能保证出栈时先左后右。
/**
* Definition for binary tree
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<int> postorderTraversal(TreeNode *root) {
vector<int> returnList;
if(root==NULL)return returnList;
stack<TreeNode*> s;
s.push(root);
TreeNode *pre = NULL;
while(!s.empty()){
TreeNode *temp = s.top();
if((temp->left==NULL&&temp->right==NULL)||
((pre!=NULL)&&(temp->left==pre||temp->right==pre))){
returnList.push_back(temp->val);
s.pop();
pre=temp;
}
else{
if(temp->right!=NULL)s.push(temp->right);
if(temp->left!=NULL)s.push(temp->left);
}
}
return returnList;
}
};