#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#define fatal(...) exit((printf("Fatal" __VA_ARGS__), puts(""), 1))
typedef struct Node Node;
struct Node {
int data;
Node *left;
Node *right;
};
int is_leaf(int c)
{
return !isalpha(c
); // non-alphas are leaves }
Node *make_node(int data)
{
Node
*node
= calloc(1, sizeof(*node
));
node->data = data;
return node;
}
void destroy_node(Node *node)
{
if (node) {
destroy_node(node->left);
destroy_node(node->right);
}
}
void print(const Node *node, int level)
{
if (node) {
print(node->left, level + 1);
printf("%*c\n", 4*level
+ 1, node
->data
); print(node->right, level + 1);
}
}
enum {
MAX = 20
};
int main(void)
{
int post[] = {'7', '6', '3', 'A', 'B', 0};
int *p = post;
Node *head = NULL;
Node *stack[MAX];
int nstack = 0;
while (*p) {
int data = *p++;
if (is_leaf(data)) {
if (nstack == MAX) fatal("Stack overflow!");
stack[nstack++] = make_node(data);
} else {
if (nstack < 2) fatal("Stack underflow!");
Node *node = make_node(data);
node->right = stack[--nstack];
node->left = stack[--nstack];
stack[nstack++] = node;
}
}
if (nstack != 1) fatal("Ill-formed full binary tree!");
head = stack[0];
print(head, 0);
destroy_node(head);
return 0;
}
CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgoKI2RlZmluZSBmYXRhbCguLi4pIGV4aXQoKHByaW50ZigiRmF0YWwiIF9fVkFfQVJHU19fKSwgcHV0cygiIiksIDEpKQoKdHlwZWRlZiBzdHJ1Y3QgTm9kZSBOb2RlOwoKc3RydWN0IE5vZGUgewogICAgaW50IGRhdGE7CiAgICBOb2RlICpsZWZ0OwogICAgTm9kZSAqcmlnaHQ7Cn07CgppbnQgaXNfbGVhZihpbnQgYykKewogICAgcmV0dXJuICFpc2FscGhhKGMpOyAgICAgLy8gbm9uLWFscGhhcyBhcmUgbGVhdmVzCn0KCk5vZGUgKm1ha2Vfbm9kZShpbnQgZGF0YSkKewogICAgTm9kZSAqbm9kZSA9IGNhbGxvYygxLCBzaXplb2YoKm5vZGUpKTsKCiAgICBub2RlLT5kYXRhID0gZGF0YTsKCiAgICByZXR1cm4gbm9kZTsgICAgCn0KCnZvaWQgZGVzdHJveV9ub2RlKE5vZGUgKm5vZGUpCnsKICAgIGlmIChub2RlKSB7CiAgICAgICAgZGVzdHJveV9ub2RlKG5vZGUtPmxlZnQpOwogICAgICAgIGRlc3Ryb3lfbm9kZShub2RlLT5yaWdodCk7CiAgICAgICAgZnJlZShub2RlKTsKICAgIH0KfQoKdm9pZCBwcmludChjb25zdCBOb2RlICpub2RlLCBpbnQgbGV2ZWwpCnsKICAgIGlmIChub2RlKSB7CiAgICAgICAgcHJpbnQobm9kZS0+bGVmdCwgbGV2ZWwgKyAxKTsKICAgICAgICBwcmludGYoIiUqY1xuIiwgNCpsZXZlbCArIDEsIG5vZGUtPmRhdGEpOwogICAgICAgIHByaW50KG5vZGUtPnJpZ2h0LCBsZXZlbCArIDEpOwogICAgfQp9CgplbnVtIHsKICAgIE1BWCA9IDIwCn07CgppbnQgbWFpbih2b2lkKQp7CiAgICBpbnQgcG9zdFtdID0geyc3JywgJzYnLCAnMycsICdBJywgJ0InLCAwfTsKICAgIGludCAqcCA9IHBvc3Q7CgogICAgTm9kZSAqaGVhZCA9IE5VTEw7CiAgICBOb2RlICpzdGFja1tNQVhdOwogICAgaW50IG5zdGFjayA9IDA7CiAgICAKICAgIHdoaWxlICgqcCkgewogICAgICAgIGludCBkYXRhID0gKnArKzsKICAgICAgICAKICAgICAgICBpZiAoaXNfbGVhZihkYXRhKSkgewogICAgICAgICAgICBpZiAobnN0YWNrID09IE1BWCkgZmF0YWwoIlN0YWNrIG92ZXJmbG93ISIpOwogICAgICAgIAogICAgICAgICAgICBzdGFja1tuc3RhY2srK10gPSBtYWtlX25vZGUoZGF0YSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKG5zdGFjayA8IDIpIGZhdGFsKCJTdGFjayB1bmRlcmZsb3chIik7CiAgICAgICAgICAgIAogICAgICAgICAgICBOb2RlICpub2RlID0gbWFrZV9ub2RlKGRhdGEpOwogICAgICAgICAgICAKICAgICAgICAgICAgbm9kZS0+cmlnaHQgPSBzdGFja1stLW5zdGFja107CiAgICAgICAgICAgIG5vZGUtPmxlZnQgPSBzdGFja1stLW5zdGFja107CiAgICAgICAgICAgIHN0YWNrW25zdGFjaysrXSA9IG5vZGU7CiAgICAgICAgfQogICAgfQogICAgCiAgICBpZiAobnN0YWNrICE9IDEpIGZhdGFsKCJJbGwtZm9ybWVkIGZ1bGwgYmluYXJ5IHRyZWUhIik7CiAgICAKICAgIGhlYWQgPSBzdGFja1swXTsKCiAgICBwcmludChoZWFkLCAwKTsKICAgIGRlc3Ryb3lfbm9kZShoZWFkKTsKICAgIAogICAgcmV0dXJuIDA7Cn0K