typedef struct TreeNode* STDataType;
typedef struct Stack
{
STDataType* _a;
int _top;
int _capacity;
}Stack;
Stack ps;
void StackInit(Stack* ps)
{
assert(ps);
ps->_a = NULL;
ps->_top = 0;
ps->_capacity = 0;
}
void StackDestory(Stack* ps)
{
assert(ps);
free(ps->_a);
ps->_a = NULL;
ps->_top = 0;
ps->_capacity = 0;
}
void StackPush(Stack* ps, STDataType x)
{
assert(ps);
if (ps->_top == ps->_capacity)
{
int newcapacity = ps->_capacity==0?4:2 * (ps->_capacity);
ps->_a= (STDataType*)realloc(ps->_a, newcapacity*sizeof(STDataType));
assert(ps->_a != NULL);
ps->_capacity = newcapacity;
}
ps->_a[ps->_top] = x;
++(ps->_top);
}
void StackPop(Stack* ps)
{
assert(ps&&ps->_top > 0);
--(ps->_top);
}
STDataType StackTop(Stack* ps)
{
assert(ps&&ps->_top > 0);
return ps->_a[ps->_top-1];
}
int StackEmpty(Stack* ps)
{
assert(ps);
if (ps->_top == 0)
{
return 0;
}
else
{
return 1;
}
}
int StackSize(Stack* ps)
{
assert(ps);
return ps->_top;
}
int* postorderTraversal(struct TreeNode* root, int* returnSize){
Stack st;
StackInit(&st);
struct TreeNode* top = StackTop(&st);
struct TreeNode* prev = NULL;
while (StackEmpty(&st)!=0 || cur!=NULL){
while (cur!=NULL){
StackPush(&st);
(*returnSize)++;
cur = cur->left;
}
struct TreeNode* top = StackTop(&st);
if (top->right==prev || top->right==NULL){
StackPop(&st);
prev = top;
}
else{
cur = cur->right;
}
int *array = (int*)malloc(sizeof(int)*(*returnSize));
int i = 0;
cur = root;
while (StackEmpty(&st)!=0 || cur!=NULL){
while (cur!=NULL){
StackPush(&st,cur);
cur = cur->left;
}
struct TreeNode* top = StackTop(&st);
if (top->right==prev || top->right==NULL){
array[i++] = top->val;
prev = top;
StackPop(&st);
}
else{
cur = top->right;
}
return array;
}