大致思路:
后序遍历用栈来实现:
逆后序遍历=前序遍历的左右子树入栈顺序交换;逆后序->后序,采用栈2来倒置输出
需要注意的是,如何定义栈。之前用stack<TreeNode* >来定义,但是总会出现什么编译错误,其实最方便的还是用顺序数组来定义栈,数组类型可以是TreeNode* ,用top来标识。
切记:链表要先判空+判一个结点;树要先对根节点判空!!!!
AC代码:
/**
* 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> result;
//首先判空!
if(root==NULL)
return result;
//用顺序数组定义两个栈
TreeNode* s1[500000];
int top1=-1;
TreeNode* s2[500000];
int top2=-1;
TreeNode* p =root;
s1[++top1]=root;
while(top1!=-1)
{
p = s1[top1--];
s2[++top2]=p;//出栈是存到s2里
if(p->left!=NULL)
s1[++top1]=p->left;
if(p->right!=NULL)
s1[++top1]=p->right;
}
//输出
while(top2!=-1)
{
result.push_back(s2[top2--]->val);
}
return result;
}
};