// 函数 func:根据先序和中序遍历序列构建二叉树
// 参数:
// pre[] - 先序遍历序列数组
// mid[] - 中序遍历序列数组
// L1,R1 - 先序序列的左右边界索引
// L2,R2 - 中序序列的左右边界索引
// 返回值:构建好的二叉树根节点
BiTree func(char pre[], char mid[], int L1, int R1, int L2, int R2) {
// 创建新节点并分配内存
BiTree root = (BiTree)malloc(sizeof(BTNode));
// 先序序列的第一个元素就是当前子树的根节点
root->data = pre[L1];
// 在中序序列中查找根节点的位置
int i = L2;
for (; mid[i] != pre[L1]; i++); // 空循环体,只用于查找
// 构建左子树
if (i > L2) {
// 如果根节点在中序序列中不是最左边的元素,则存在左子树
// 左子树在先序序列中的范围:[L1+1, L1+i-L2]
// 左子树在中序序列中的范围:[L2, i-1]
root->lchild = func(pre, mid, L1 + 1, L1 + i - L2, L2, i - 1);
} else {
// 不存在左子树
root->lchild = NULL;
}
// 构建右子树
if (i < R2) {
// 如果根节点在中序序列中不是最右边的元素,则存在右子树
// 右子树在先序序列中的范围:[L1+i-L2+1, R1]
// 右子树在中序序列中的范围:[i+1, R2]
root->rchild = func(pre, mid, L1 + i - L2 + 1, R1, i + 1, R2);
} else {
// 不存在右子树
root->rchild = NULL;
}
return root; // 返回构建好的子树根节点
}
// 函数 func:根据后序和中序遍历序列构建二叉树
// 参数含义与上面类似
BiTree func(char post[], char mid[], int L1, int R1, int L2, int R2) {
// 创建新节点并分配内存
BiTree root = (BiTree)malloc(sizeof(BTNode));
// 后序序列的最后一个元素就是当前子树的根节点
root->data = post[R1];
// 在中序序列中查找根节点的位置
int i = L2;
for (; mid[i] != post[R1]; i++); // 空循环体,只用于查找
// 构建左子树
if (i > L2) {
// 如果根节点在中序序列中不是最左边的元素,则存在左子树
// 左子树在后序序列中的范围:[L1, i-L2+L1-1]
// 左子树在中序序列中的范围:[L2, i-1]
root->lchild = func(post, mid, L1, i - L2 + L1 - 1, L2, i - 1);
} else {
// 不存在左子树
root->lchild = NULL;
}
// 构建右子树
if (i < R2) {
// 如果根节点在中序序列中不是最右边的元素,则存在右子树
// 右子树在后序序列中的范围:[i-L2+L1, R1-1]
// 右子树在中序序列中的范围:[i+1, R2]
root->rchild = func(post, mid, i - L2 + L1, R1 - 1, i + 1, R2);
} else {
// 不存在右子树
root->rchild = NULL;
}
return root; // 返回构建好的子树根节点
}