zoukankan      html  css  js  c++  java
  • 根据前序遍历和中序遍历结果恢复二叉树

    思路

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

    # 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;
    }
    
  • 相关阅读:
    mysq 中 information_schema 库
    python mysql创建表
    Mysql 连接池
    mysql 事务、游标
    python 操作数据库1--连接、执行sql语句
    搭建自动化脚本运行环境
    快速定位XPATH
    Fiddler--Filters
    Fiddler--Composer
    Fiddler--AutoResponder
  • 原文地址:https://www.cnblogs.com/haoabcd2010/p/11081203.html
Copyright © 2011-2022 走看看