• 根据前序遍历和中序遍历结果恢复二叉树


    思路

    思路比较简单,不断划分区间即可
    先序遍历的字符串的首字符肯定是树的根节点,而中序遍历的字符串的左右子树肯定被根分割开。

    # include <cstdio>
    using namespace std;
    /**************************/
    struct Node{
        char v;
        Node * left;
        Node * right;
    } * root;
    
    void init() {
        root = NULL;
    }
    
    Node * create_node(char v){
        Node * p = new Node;
        p->v = v;
        p->left = NULL;
        p->right = NULL;
        return p;
    }
    
    Node * reConstructTree(char pre[], int pl, int pr, char in[], int il, int ir) {
        if (pl > pr) return NULL;
        else if (pl == pr) return create_node(pre[pl]); // 只有一个节点
    
        char spc = pre[pl];
        for (int i=il; i<=ir; i++) {
            if (spc == in[i]) {
                // 划分左右子树
                int offset = i-il;
                Node * l = reConstructTree(pre, pl+1, pl+offset, in, il, i-1);
                Node * r = reConstructTree(pre, pl+offset+1, pr, in, i+1, ir);
                // 新建节点,指向左右子树
                Node * p = create_node(spc);
                p->left = l;
                p->right = r;
                return p;
            }
        }
        return NULL; //出错
    }
    
    //中序遍历
    void inOrder(Node * p) {
        if (p == NULL) return;
        inOrder(p->left);
        printf("%c-", p->v);
        inOrder(p->right);
    }
    
    
    int main() {
        init();
        char pre[] = "123456";
        char in[] = "324165";
        root = reConstructTree(pre, 0, 5, in, 0, 5);
        inOrder(root);
        return 0;
    }
    
  • 相关阅读:
    [vue Debugger] sourcemap
    [vuex]持久化存储
    [vuex]字典值封装到vuex缓存
    [vue]常用指令集合
    VSCode插件集合
    [element-ui] 表格点击出现编辑效果实现
    [pdf] 插件实现pdf上传预览、打印
    [html] 特殊字符
    [element-ui] 穿梭框对象重复不添加方案
    Redis持久化
  • 原文地址:https://www.cnblogs.com/haoabcd2010/p/11081203.html
Copyright © 2020-2023  润新知