Quick actions

cmd+k|ctrl+k

Navigation

Languages

print binary tree

Snippet info

Language

C

Visibility

public

Author

hyrious

Created

2021-03-26T13:29:34.990775Z

Updated

2021-03-26T13:29:34.990775Z

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

char input[256]; int i;

struct node_t {
    char x;
    struct node_t *left, *right;
};

struct node_t *node(char x, struct node_t *left, struct node_t *right) {
    struct node_t *p = (struct node_t *)malloc(sizeof(struct node_t));
    *p = (struct node_t){ x, left, right };
    return p;
}

// root ['(' [left] ',' [right] ')']
struct node_t *parse_tree() {
    char x = input[i]; i++;
    struct node_t *left = NULL, *right = NULL;
    if (input[i] == '(') {
        i++; if (input[i] != ',') left  = parse_tree();
        i++; if (input[i] != ')') right = parse_tree();
        i++;
    }
    return node(x, left, right);
}

void delete_tree(struct node_t *tree) {
    if (tree) {
        delete_tree(tree->left);
        delete_tree(tree->right);
        free(tree);
    }
}

struct node_t *read_tree() {
    i = 0; scanf("%s", input);
    return parse_tree();
}

int calc_height(struct node_t *tree) {
    if (!tree) return 0;
    int left  = calc_height(tree->left);
    int right = calc_height(tree->right);
    return (left > right ? left : right) + 1;
}

void transform_tree(struct node_t *tree, char target[], int i) {
    if (tree) {
        target[i] = tree->x;
        transform_tree(tree->left,  target, i * 2 + 1);
        transform_tree(tree->right, target, i * 2 + 2);
    }
}

void pad(int n) {
    for (int i = 0; i < n; ++i) printf(" ");
}

void print_tree(struct node_t *tree) {
    char target[64] = "";
    transform_tree(tree, target, 0);
    int height = calc_height(tree), k = 0;
    for (int i = 0; i < height; ++i) {
        int padding = 1 << (height - i);
        pad(padding);
        for (int j = 0, n = 1 << i; j < n; ++j) {
            char x = target[k++];
            if (x) {
                printf("%c", x);
            } else {
                printf("_");
            }
            pad(padding * 2);
        }
        printf("\n");
    }
}

int main() {
    struct node_t *tree = read_tree();
    print_tree(tree);
    delete_tree(tree);
}
INFO