思路比較簡單,不斷劃分區間便可
先序遍歷的字符串的首字符確定是樹的根節點,而中序遍歷的字符串的左右子樹確定被根分割開。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; }