PYozo  

递归:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 30;
typedef int ElementType;

struct TreeNode {
    ElementType Data;
    struct TreeNode *Left;
    struct TreeNode *Right;
    struct TreeNode *Next;
};
typedef struct TreeNode *BinTree;
typedef struct TreeNode *Stack;

Stack pop(Stack S);
Stack CreateStack();
void push(Stack s, BinTree T);
BinTree CreateTreeNode();
BinTree CreateBinTree(int op[], int in[], int par_s);
void PostOrderTraversal(BinTree BT, ElementType root);

int main()
{
    BinTree BT;
    int N, i, e;
    int index_j = 0, index_i = 0;
    char action[5];
    scanf("%d", &N);
    int *in = (int*)malloc(sizeof(int)*N);
    int *op = (int*)malloc(sizeof(int) * 2 * N);
    getchar();
    for (i = 0; i < N * 2; i++)
    {
        scanf("%s", action);
        getchar();
        if (strcmp(action, "Push") == 0)
        {
            scanf("%d", &e);
            in[index_i++] = e;
            op[i] = 1;
        }
        else
        {
            op[i] = 0;
        }
    }
    BT=CreateBinTree(op, in, N);
    PostOrderTraversal(BT, BT->Data);
}

Stack CreateStack()
{
    Stack s;
    s = (Stack)malloc(sizeof(struct TreeNode));
    s->Next = NULL;
    return s;
}

void push(Stack s, BinTree T)
{
    if (s == NULL)
        s = CreateStack();
    T->Next = s->Next;
    s->Next = T;
}

Stack pop(Stack S)
{
    Stack temp = NULL,n;
    if (!S || S->Next == NULL)
        return NULL;
    temp = S->Next;
    S->Next = temp->Next;
    n = temp;
    temp = NULL;
    return n;
}

BinTree CreateTreeNode()
{
    BinTree Node = (BinTree)malloc(sizeof(struct TreeNode));
    Node->Left = NULL;
    Node->Right = NULL;
    return Node;
}

BinTree CreateBinTree(int op[], int in[], int par_s)
{
    BinTree root = NULL;
    BinTree temp = NULL, Node = NULL;
    Stack S;
    int i = 0, n = 0;
    if (par_s == 1)
    {
        root = CreateTreeNode();
        root->Data = in[i];
        return root;
    }
    else if (par_s == 0)
        return NULL;
    else
    {
        S = CreateStack();
        root = CreateTreeNode();
        root->Data = in[i];
        Node = root;
        temp = root;
        push(S, temp);
        n++;
        for (i = 1; i < 2 * par_s; i++)
        {
            if (op[i])
            {
                
                Node = CreateTreeNode();
                Node->Data = in[n];
                push(S, Node);
                if (temp->Left == NULL && op[i - 1])
                    temp->Left = Node;
                else
                    temp->Right = Node;
                temp = Node;
                n++;
            }
            else
            {
                temp=pop(S);
            }
        }
    }
    free(S);
    return root;
}

void PostOrderTraversal(BinTree BT,ElementType root)
{
    if (BT->Left)
        PostOrderTraversal(BT->Left, root);
    if (BT->Right)
        PostOrderTraversal(BT->Right, root);
    if (BT->Data == root)
        printf("%d", BT->Data);
    else
        printf("%d ", BT->Data);
}

非递归:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MaxSize 30;
typedef int ElementType;

struct TreeNode {
    ElementType Data;
    struct TreeNode *Left;
    struct TreeNode *Right;
    struct TreeNode *Next;
};
typedef struct TreeNode *BinTree;
typedef struct TreeNode *Stack;

Stack pop(Stack S);
Stack CreateStack();
void push(Stack s, BinTree T);
BinTree CreateTreeNode();
BinTree CreateBinTree(int op[], int in[], int par_s);
void PostOrderTraversal(BinTree T, ElementType root);

int main()
{
    BinTree BT;
    int N, i, e;
    int index_j = 0, index_i = 0;
    char action[5];
    scanf_s("%d", &N);
    int *in = (int*)malloc(sizeof(int)*N);
    int *op = (int*)malloc(sizeof(int) * 2 * N);
    getchar();
    for (i = 0; i < N * 2; i++)
    {
        scanf_s("%s", action, 5);
        getchar();
        if (strcmp(action, "Push") == 0)
        {
            scanf_s("%d", &e);
            in[index_i++] = e;
            op[i] = 1;
        }
        else
            op[i] = 0;
    }
    BT=CreateBinTree(op, in, N);
    PostOrderTraversal(BT, BT->Data);
}

Stack CreateStack()
{
    Stack s;
    s = (Stack)malloc(sizeof(struct TreeNode));
    s->Next = NULL;
    return s;
}

void push(Stack s, BinTree T)
{
    if (s == NULL)
        s = CreateStack();
    T->Next = s->Next;
    s->Next = T;
}

Stack pop(Stack S)
{
    Stack temp = NULL,n;
    if (!S || S->Next == NULL)
        return NULL;
    temp = S->Next;
    S->Next = temp->Next;
    n = temp;
    temp = NULL;
    return n;
}

BinTree CreateTreeNode()
{
    BinTree Node = (BinTree)malloc(sizeof(struct TreeNode));
    Node->Left = NULL;
    Node->Right = NULL;
    return Node;
}

BinTree CreateBinTree(int op[], int in[], int par_s)
{
    BinTree root = NULL;
    BinTree temp = NULL, Node = NULL;
    Stack S;
    int i = 0, n = 0;
    if (par_s == 1)
    {
        root = CreateTreeNode();
        root->Data = in[i];
        return root;
    }
    else if (par_s == 0)
        return NULL;
    else
    {
        S = CreateStack();
        root = CreateTreeNode();
        root->Data = in[i];
        Node = root;
        temp = root;
        push(S, temp);
        n++;
        for (i = 1; i < 2 * par_s; i++)
        {
            if (op[i])
            {
                
                Node = CreateTreeNode();
                Node->Data = in[n];
                push(S, Node);
                if (temp->Left == NULL && op[i - 1])
                    temp->Left = Node;
                else
                    temp->Right = Node;
                temp = Node;
                n++;
            }
            else
                temp=pop(S);
        }
    }
    free(S);
    return root;
}

void PostOrderTraversal(BinTree T,ElementType root)
{
    BinTree temp = NULL;
    Stack S = CreateStack();
    while (T || S->Next) {
        while (T) {
            push(S, T);
            T = T->Left;
        }
        if (S->Next)
        {
            T = pop(S);
            push(S, T);
            T = T->Right;
            if (!T||T==temp)
            {
                temp = pop(S);
                printf("%d", temp->Data);
                if (temp->Data != root)
                    printf(" ");
                T = NULL;
            }
        }
    }
}

这里用的是堆栈构树的。

posted on 2019-08-01 20:00  PYozo  阅读(145)  评论(0编辑  收藏  举报