题目要求:先序、中序和后序数组两两结合重构二叉树已知一棵二叉树的所有节点都不同,给定二叉树的先序、中序和后序数组,请分别用三个函数实现任意两种组合重构原来的二叉树,并返回重构二叉树的头节点。
题目解析:
这道题目中,由先序数组,中序数组组合重构二叉树无难度,同理由中序数组,后序数组结合重构二叉树也没有难度,但是由后序数组和先序数组在很多情况下是不能重构出二叉树的,比如先序数组是【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);
}
路漫漫其修远兮,吾将上下而求索…