根據前序遍歷和中序遍歷結果恢復二叉樹

思路

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