Untitled

 avatar
unknown
c_cpp
2 years ago
2.2 kB
6
Indexable
#include <stdio.h>
#include <stdlib.h>

typedef struct _node
{
    int value;
    struct _node *left;
    struct _node *right;
} Node;

int n;
int pos;
int post_index;

Node *Create_Node(int value);
Node *Build(int *inorder, int *preorder, int inorder_start, int inorder_end);
int Verify(Node *root, int *postorder);
void Destroy(Node *root);

int main(void)
{
    Node *head;
    int t;

    scanf("%d", &n);
    int pre[n + 1];  // root -> left -> right
    int post[n + 1]; // left -> right -> root
    int in[n + 1];   // left -> root -> right

    for (int i = 0; i < n; ++i)
        scanf("%d", &pre[i]);
    for (int i = 0; i < n; ++i)
        scanf("%d", &post[i]);

    scanf("%d", &t);
    for (int j = 0; j < t; ++j)
    {
        pos = post_index = 0;
        for (int i = 0; i < n; ++i)
            scanf("%d", &in[i]);
        head = Build(in, pre, 0, n - 1); // n-1超級重要!!! 因為要丟進去的是index
        printf("%s\n", Verify(head, post) ? "Yes" : "No");
        Destroy(head);
    }
}

Node *Create_Node(int value)
{
    Node *New_Node = malloc(sizeof(Node));

    New_Node->value = value;
    New_Node->left = NULL;
    New_Node->right = NULL;

    return New_Node;
}

Node *Build(int *inorder, int *preorder, int inorder_start, int inorder_end)
{
    Node *root = NULL;
    if (inorder_start <= inorder_end && pos < n)
    {
        root = Create_Node(preorder[pos++]);

        int root_index = 0;
        for (root_index = inorder_start; root_index <= inorder_end; ++root_index)
            if (inorder[root_index] == root->value)
                break;

        root->left = Build(inorder, preorder, inorder_start, root_index - 1);
        root->right = Build(inorder, preorder, root_index + 1, inorder_end);
    }
    return root;
}

int Verify(Node *root, int *postorder)
{
    int ans = 1;
    if (root != NULL)
    {
        ans *= Verify(root->left, postorder);
        ans *= Verify(root->right, postorder);
        if (root->value != postorder[post_index++])
            ans = 0;
    }
    return ans;
}

void Destroy(Node *root)
{
    if (root != NULL)
    {
        Destroy(root->left);
        Destroy(root->right);
        free(root);
    }
}
Editor is loading...