# 13836 - Monica’s request >author: Utin ###### tags: `binary tree` --- ## Brief 以preorder的順序建立節點,並以inorder的排序確認子節點位於左子樹或是右子樹,最後以輸出postorder的概念比對節點是否正確 * 建構二元樹必須知道中序和(前序或後序),只知道前序與後序建構不了二元樹 ## Solution 0 ```c= #include <stdio.h> #include <stdlib.h> typedef struct _node { int value; struct _node* left, * right; } Node; int len, T, preorder[200001], inorder[200001], postorder[200001], pos; Node* head; Node* create_node(int value); int verify(Node* root); void destroy(Node* root); Node* build(int in_idx, int inorder_start, int inorder_end); int main() { scanf("%d", &len); for (int i = 0; i < len; i++) scanf("%d", &preorder[i]); for (int i = 0; i < len; i++) scanf("%d", &postorder[i]); scanf("%d", &T); while (T--) { int Start; pos = 0; for (int i = 0; i < len; i++) { scanf("%d", &inorder[i]); if (inorder[i] == preorder[0]) Start = i; } head = build(Start, 0, len); pos = 0; verify(head) ? printf("Yes\n") : printf("No\n"); destroy(head); } } // in_idx為root的位置 // inorder_start為區間起始的位置 // inorder_end為區間結束的位置 Node* build(int in_idx, int inorder_start, int inorder_end) { Node* root = create_node(preorder[pos++]); // 左區間 for (int i = inorder_start; i < in_idx; i++) { if (inorder[i] == preorder[pos]) { root->left = build(i, inorder_start, in_idx); break; } } // 右區間 for (int i = in_idx + 1; i < inorder_end; i++) { if (inorder[i] == preorder[pos]) { root->right = build(i, in_idx + 1, inorder_end); break; } } return root; } Node* create_node(int value) { Node* new_node = (Node*) malloc(sizeof(Node)); new_node->value = value; new_node->left = NULL; new_node->right = NULL; return new_node; } int verify(Node* root) { if (root->left && !verify(root->left)) return 0; if (root->right && !verify(root->right)) return 0; if (root->value != postorder[pos++]) return 0; return 1; } void destroy(Node* root) { if (root->left) destroy(root->left); if (root->right) destroy(root->right); free(root); } // Utin ``` ## Reference