---
# System prepended metadata

title: 13847 - Reconstruct broken binary trees
tags: [binary tree]

---

# 13847 - Reconstruct broken binary trees
>author: Utin
###### tags: `binary tree`
---

## Brief
See the code below

## Solution 0

```c=
#include <stdio.h>
#include <stdlib.h>

typedef struct _node {
    int idx, level, left, right;
} Node;

Node arr[3001];
int inorder[3001];
int op[1505][2];
int Root, N, count = 0;

void add_node(int root, int root_idx, int start, int end);
void print_tree(int root);

int main() {
    scanf("%d", &N);

    // record the inorder_idx of each node
    for (int i = 0; i < N; i++) {
        scanf("%d", &inorder[i]);
        arr[inorder[i]].idx = i;
    }

    // record the level of node and count the Root
    int sum = N * (N + 1) / 2;
    for (int i = 0; i < (N - 1) / 2; i++) {
        scanf("%d %d", &op[i][0], &op[i][1]);
        arr[op[i][0]].level = arr[op[i][1]].level = i;
        sum -= op[i][0] + op[i][1];
    }
    Root = sum;

    // construct the tree
    add_node(Root, arr[Root].idx, 0, N);

    // output
    print_tree(Root);
}

void add_node(int root, int root_idx, int start, int end) {
    if (!root) return;

    // search the nodes with same level but in different interval
    int flag = 1;
    for (int i = start; i < root_idx && flag; i++) {
        for (int j = root_idx + 1; j < end && flag; j++) {
            if (arr[inorder[i]].level == arr[inorder[j]].level) {
                arr[root].left = inorder[i];
                arr[root].right = inorder[j];
                flag = 0;
            }
        }
    }

    add_node(arr[root].left, arr[arr[root].left].idx, start, root_idx);
    add_node(arr[root].right, arr[arr[root].right].idx, root_idx + 1, end);
}

void print_tree(int root) {
    printf("%d", root);
    count++;
    count == N ? printf("\n") : printf(" ");
    if (arr[root].left) print_tree(arr[root].left);
    if (arr[root].right) print_tree(arr[root].right);
}

// Utin
```

## Reference