//根据前序、中序重建二叉树
BitTree* reConstructBinTree(int pre[], int startPre, int endPre,
int in[], int startIn, int endIn) {
//如果起始的下标大于结束的下标,那么就退出
if (startPre > endPre || startIn > endIn) {
return NULL;
}
//前序找到根节点
BitTree* pNode = (BitTree*)malloc(sizeof(BitTree));
pNode->left = NULL;
pNode->right = NULL;
pNode->data = pre[startPre];//前根当中的首元素一定是当前子树的根节点
for (int i = startIn;i <= endIn;i++) {
if (in[i] == pre[startPre]) {
//i-startIn就是左子树节点的个数
//i -1就是中序遍历左子树的终点
pNode->left = reConstructBinTree(pre, startPre + 1, startPre + i - startIn, in, startIn, i - 1);
//前序右子树的遍历起始值:startPre+i-startIn+1
//中序遍历右子树的起始值:i+1,endIn(i理解成你第几次切刀)
pNode->right = reConstructBinTree(pre, i - startIn + startPre + 1, endPre, in, i + 1, endIn);
}
}
return pNode;
}
//************Beign 二叉树重建
//前序遍历{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6}
/*int pre[] = { 1,2,4,7,3,5,6,8 };
int in[] = { 4,7,2,1,5,3,8,6 };
BitTree* rootNew;
rootNew = reConstructBinTree(pre, 0, 7, in, 0, 7);
preorder(rootNew);
printf("\n");
inorder(rootNew);*/
//*************End 二叉树重建
10-30
7628
05-12
2万+
08-18
3333
09-17
1374