您的位置:首页 > 其它

hihoCoder 1049 后序遍历

2015-08-01 10:22 573 查看
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

struct BTreeNode{
    char e;
    BTreeNode *left;
    BTreeNode *right;
};
typedef BTreeNode* BTree;

BTreeNode *createBTreeNode(char e) {
    BTreeNode *nd = new BTreeNode;
    nd->e = e;
    nd->left = NULL;
    nd->right = NULL;
    return nd;
}
int findChar(const char *str, int s1, int s2, char c) {
    if (!str || s2 < s1 || s1 < 0 || s2 >= strlen(str))
        return -1;
    for (int i = s1; i <= s2; i++) {
        if (str[i] == c)
            return i;
    }
    return -1;
}
BTreeNode *getRoot(char *pre, int p1, int p2, char *in, int i1, int i2) {
    char rootch = pre[p1];
    if (!pre || p2 < p1 || p1 < 0 || p2 >= strlen(pre) || !in || i2 < i1 || i1< 0 || i2 >= strlen(in))
        return NULL;
    int tmp = findChar(in, i1, i2, rootch);
    if (tmp < 0)
        return NULL;
    BTreeNode *nd = createBTreeNode(rootch);
    nd->left = getRoot(pre, p1 + 1, p1 + tmp - i1, in, i1, tmp - 1);
    nd->right = getRoot(pre, p1 + tmp - i1 + 1, p2, in, tmp + 1, i2);
    return nd;
}
BTree createBTree(char *pre, char *in) {
    if (!pre || !in)
        return NULL;
    return getRoot(pre, 0, strlen(pre) - 1, in, 0, strlen(in) - 1);
}
void post_order(BTree t) {
    if (!t)
        return;
    post_order(t->left);
    post_order(t->right);
    printf("%c", t->e);
}

int main(){
    char pre[30];
    char in[30];
    scanf("%s",pre);
    scanf("%s",in);
    BTree t = createBTree(pre, in);
    post_order(t);
    printf("\n");
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: