資料結構和演算法經典100題-第30題
阿新 • • 發佈:2019-02-18
題目要求:先序、中序和後序陣列兩兩結合重構二叉樹已知一棵二叉樹的所有節點都不同,給定二叉樹的先序、中序和後序陣列,請分別用三個函式實現任意兩種組合重構原來的二叉樹,並返回重構二叉樹的頭節點。
題目解析:
這道題目中,由先序陣列,中序陣列組合重構二叉樹無難度,同理由中序陣列,後序陣列結合重構二叉樹也沒有難度,但是由後序陣列和先序陣列在很多情況下是不能重構出二叉樹的,比如先序陣列是【1,2】,後序陣列是【2,1】,則存在兩種可能的二叉樹結構。只有在二叉樹每個節點的孩子數要麼是0要麼是2的情況下才能構建出二叉樹。
這道題就不多說廢話,因為它與前面(昨天寫得文章)一道由先序陣列和中序陣列生成後序陣列的題很像。具體的可以參考那道題。
No code say what?
struct Node {
int value;
Node *left;
Node *right;
};
Node *createNode(int value) {
Node * N = new Node();
N->value = value;
N->left = NULL;
N->right = NULL;
return N;
}
// 由先序陣列和中序陣列結合構建二叉樹節點.
Node *generateNode(int *pre, int preBeg, int preEnd, int *in, int inBeg,
int inEnd, map<int, int> &inMap) {
int i = inMap[pre[preBeg]];
Node *head = createNode(pre[preBeg]);
head->left = generateNode(pre, preBeg + 1, preBeg + i - 1, in, inBeg, i - 1, inMap);
head->right = generateNode(pre, preBeg + i, preEnd, in, i + 1 , inEnd, inMap);
return head;
}
// 由先序陣列和中序陣列結合構建二叉樹.
Node *generateTree(int *pre, int *in, int len) {
if (!pre || !in) {
return NULL;
}
map<int, int> inMap;
for (int i = 0; i < len; ++i) {
inMap[in[i]] = i;
}
return generateNode(pre, 0, len - 1, in, 0, len - 1, inMap);
}
// 由後序陣列和中序陣列結合構建二叉樹節點.
Node *generateNode2(int *pos, int posBeg, int posEnd, int *in, int inBeg,
int inEnd, map<int, int> &inMap) {
int i = inMap[pos[posEnd]];
Node *head = createNode(pos[posEnd]);
head->left = generateNode2(pos, posBeg, posBeg + i - 1, in, inBeg, i - 1, inMap);
head->right = generateNode2(pos, posBeg + i, posEnd - 1, in, i + 1, inEnd, inMap);
return head;
}
// 由後序陣列和中序陣列結合構建二叉樹.
Node *generateTree2(int *in, int *pos, int len) {
if (!pos || !in) {
return NULL;
}
map<int, int> inMap;
for (int i = 0; i < len; ++i) {
inMap[in[i]] = i;
}
return generateNode2(pos, 0, len - 1, in, 0, len - 1, inMap);
}
路漫漫其修遠兮,吾將上下而求索…