4种建树问题

Posted littlepage

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了4种建树问题相关的知识,希望对你有一定的参考价值。

4种建树问题

前中建树

void pre(int root, int start, int end) {
    if(start > end) return ;
    int i = start;
    while(i < end && in[i] != post[root]) i++;
    printf("%d ", post[root]);
    pre(root - 1 - end + i, start, i - 1);
    pre(root - 1, i + 1, end);
}

后中建树

void post(int root, int start, int end) {
    if(start > end) 
        return ;
    int i = start;
    while(i < end && in[i] != pre[root]) i++;
    post(root + 1, start, i - 1);
    post(root + 1 + i - start, i + 1, end);
    printf("%d ", pre[root]);
}

层中建树

node* build(int level_left, int level_right, int in_left, int in_right) {
    if(in_left > in_right) return NULL;
    int k, flag = 0;
    while(level_left <= level_right) {
        for(k = in_left; k <= in_right; k++)
            if(in[k] == level[level_left]) {
                flag = 1;
                break;
            }
        if(flag) break;
        level_left++;
    }
    node *n = new node(in[k]);
    n->left = build(level_left + 1, level_right, in_left, k - 1);
    n->right = build(level_left + 1, level_right, k + 1, in_right);
    return n;
}

先序后序

node *build(int pre_l, int pre_r, int post_l, int post_r) {
    if(pre_l > pre_r) return NULL;
    if(pre_l == pre_r) return new node(pre[pre_l]);
    node *n = new node(pre[pre_l]);
    int k = post_l;
    while(k < post_r && post[k] != pre[pre_l + 1]) k++;
    n->left = build(pre_l + 1, pre_l + 1 + k - post_l, post_l , k - 1);
    n->right = build(pre_l + 1 + k - post_l + 1, pre_r, k + 1, post_r - 1);
    return n;
}

以上是关于4种建树问题的主要内容,如果未能解决你的问题,请参考以下文章

[无需建树]已知前序或后序和中序遍历结果,输出前序或后序或层次遍历的方法汇总

三种建树方法

模板已知二叉树两种序列求另外一种序列--非建树

HDU 1754线段树基本操作,建树,更新,查询

Huffman树 建树方法代码实现

1143 Lowest Common Ancestor(建树与不建两种思路)