思路比较简单,不断划分区间便可
先序遍历的字符串的首字符确定是树的根节点,而中序遍历的字符串的左右子树确定被根分割开。node
# 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; }