剑指offer7. 重建二叉树 p62
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2, 4, 7, 3, 5, 6, 8}和中序遍历序列{4, 7, 2, 1, 5, 3, 8, 6},则重建出 图2.6所示的二叉树并输出它的头结点。
struct BinaryTreeNode {
int key;
BinaryTreeNode *left;
BinaryTreeNode *right;
BinaryTreeNode(int val) { key = val; left = right =NULL;}
};
// pre,in 分别是先序和中序列,length是序列长
BinaryTreeNode *constructBinaryTree(std::vector<int> pre, std::vector<int> in, int length) {
if (pre.size() == 0 || in.size() == 0 || length == 0) return NULL;
BinaryTreeNode *head = new BinaryTreeNode(pre[0]); //初始化根节点
// 下面四个数组分别存储左,右子树的先根,中根序列
std::vector<int> leftpre, leftin, rightpre, rightin;
int root; // 根节点索引
for (int i = 0; i < length; ++i) {
if (in[i] == pre[0]) { // 在中根序列中找到当前树根节点root的索引
root = i;
break;
}
}
for (int i = 0; i < root; ++i) { // 以root为界左边是左子树的先序,中序
leftpre.push_back(pre[i + 1]);
leftin.push_back(in[i]);
}
for (int i = root + 1; i <length; ++i) {//以root为界右边是右子树的先序,中序
rightpre.push_back(pre[i]);
rightin.push_back(in[i]);
}
//在下面完成父子节点的链接 ,并递归构建左右子树
head -> left = constructBinaryTree(leftpre, leftin, leftpre.size());
head -> right = constructBinaryTree(rightpre, rightin, rightpre.size());
return head;
}