In: Computer Science
Design a nonrecursive post order traversal algorithm.
1.Use the linked representation for the binary tree to be traversed.
2.Except left, right, and data fields, there are no other fields in a node.
3.After the traversal the tree should remain intact.
4.Use only one stack.
5.You can’t push anything other than nodes into the stack.
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 10
struct BinaryTreeNode
{
        int data;
        struct BinaryTreeNode *left;
        struct BinaryTreeNode *right;
};
struct Queue
{
        struct BinaryTreeNode *node;
        struct Queue *next;
};
struct ArrayStack
{
        int top;
        int capacity;
        struct BinaryTreeNode **array;
};
struct ArrayStack *CreateStack()
{
        struct ArrayStack *S = malloc(sizeof(struct ArrayStack));
        if(!S)
        {
                return NULL;
        }
        S -> capacity = MAXSIZE;
        S -> top = -1;
        S -> array = malloc(S -> capacity * sizeof(struct BinaryTreeNode));
        if(!S -> array)
        {
                return NULL;
        }
        return S;
}
int IsEmptyStack(struct ArrayStack *S)
{
        return S -> top == -1;
}
int IsFullStack(struct ArrayStack *S)
{
        return S -> top == S -> capacity - 1;
}
void Push(struct ArrayStack *S, struct BinaryTreeNode *data)
{
        if(IsFullStack(S))
        {
                printf("Stack Overflow\n");
        }
        else
        {
                S -> array[++S -> top] = data;
        }
}
void Pop(struct ArrayStack *S)
{
        if(IsEmptyStack(S))
        {
                printf("Stack is Empty\n");
        }
        else
        {
                S -> array[S -> top--];
        }
}
struct BinaryTreeNode *Top(struct ArrayStack *S)
{
        return S -> array[S -> top];
}
void DeleteStack(struct ArrayStack *S)
{
        if(S)
        {
                if(S -> array)
                {
                        free(S->array);
                }
                free(S);
        }
}
struct Queue *Q = NULL;
struct BinaryTreeNode *root = NULL;
void EnQueue(struct BinaryTreeNode *node)
{
        struct Queue *newNode = (struct Queue*)malloc(sizeof(struct Queue));
        newNode->node = node;
        newNode->next = NULL;
        if(Q == NULL)
        {
                Q = newNode;
        }
        else
        {
                struct Queue *current;
                current = Q;
                while(current->next!=NULL)
                {
                        current = current -> next;
                }
                current->next = newNode;
        }
}
struct BinaryTreeNode* DeQueue()
{
        if(Q == NULL)
        {
                return NULL;
        }
        else
        {
                struct Queue *current;
                current = Q;
                Q = Q->next;
                return current->node;
        }
        
}
int IsEmptyQueue()
{
        if(Q == NULL)
        {
                return 1;
        }
        else
        {
                return 0;
        }
}
void InsertInBinaryTree(int data)
{
        struct BinaryTreeNode *temp;
        struct BinaryTreeNode *newNode;
        newNode = (struct BinaryTreeNode*)malloc(sizeof(struct BinaryTreeNode));
        newNode->data = data;
        newNode->left = newNode->right = NULL;
        if(root == NULL)
        {
                root = newNode;
                return;
        }
        else
        {
                EnQueue(root);
                while(!IsEmptyQueue())
                {
                        temp = DeQueue();
                        if(temp->left)
                        {
                                EnQueue(temp->left);
                        }
                        else
                        {
                                temp->left = newNode;
                                Q = NULL;
                                return;
                        }
                        if(temp->right)
                        {
                                EnQueue(temp->right);
                        }
                        else
                        {
                                temp->right = newNode;
                                Q = NULL;
                                return;
                        }
                }
        }       
        Q = NULL;
}
void PostOrderNonRecursive(struct BinaryTreeNode *root)
{
        struct ArrayStack *S = CreateStack();
        struct BinaryTreeNode *previous = NULL;
        do
        {
                while(root != NULL)
                {
                        Push(S,root);
                        root = root-> left;
                }
                while(root == NULL && !IsEmptyStack(S))
                {
                        root = Top(S);
                        if(root -> right == NULL || root -> right == previous)
                        {
                                printf("%d->",root->data);
                                Pop(S);
                                previous = root;
                                root = NULL;
                        }
                        else
                        {
                                root = root -> right;
                        }
                }
        }while(!IsEmptyStack(S));
        printf("\n");
}
int main()
{
        InsertInBinaryTree(1);
        InsertInBinaryTree(2);
        InsertInBinaryTree(3);
        InsertInBinaryTree(4);
        InsertInBinaryTree(5);
        InsertInBinaryTree(6);
        InsertInBinaryTree(7);
        PostOrderNonRecursive(root);
}

If you have any doubts please feel free to ask in comments and please don't dislike.