思路写在了注解上
//根据先序序列pre[pre_low..pre_low+len-1]和中序序列in[in_low..in_low+len-1]建树t
void BuildTree(BiTree& t, char pre[], int pre_low, char in[], int in_low, int len)
{
/****在此下面完成代码************/
//不满足条件
if (len <= 0){
t = NULL;
return;
}
//创建根节点
BiTNode* root = (BiTNode*)malloc(sizeof(BiTNode));
if (root == NULL){
exit(-1);
}
int rootIndex = -1;
//直接从中序字符数组里面找,就从in_low索引开始,in_low + len 就是数组的长度,直到遍历完(一定会在某次循环break跳出去)
for (rootIndex = in_low; rootIndex < in_low + len; rootIndex++) {
if (pre[pre_low] == in[rootIndex]) {
//找到中序的根节点索引位置,直接跳出
break;
}
}
//创建的结点进行初始化
root->data = pre[pre_low];
root->lchild = NULL;
root->rchild = NULL;
t = root;
//位置要更新
//最难理解的地方
//分治,想要创建一棵树,就先创建他的左子树和右子树
//想创建左子树和右子树,就要先创建左子树和右子树的左子树和右子树
//一直循环下去,直到分到数组长度小于等于零
//现在是左右子树怎么递归?
BuildTree(root->lchild, pre, pre_low + 1, in, in_low, rootIndex - in_low);
BuildTree(root->rchild, pre, pre_low + rootIndex - in_low + 1, in, rootIndex + 1, len - (rootIndex - in_low + 1));
//构建右子树个人理解,为了得到右子树先序的其实索引
// pre_low + rootIndex - in_low + 1 可以写成 pre_low + (rootIndex - in_low) + 1
//pre_low是记录先序的起始位置,rootIndex - in_low是左子树的结点个数,pre_low加rootIndex - in_low就是先序中跳过几个元素才能跳过左子树
//又因为pre_low是一个新的根节点,所以应该再加一才能真正的指向右子树的先序起始索引
//递归的中序起始索引个人理解
//len 为长度,(这个长度可能会小于中序的起始索引)
//想要得到右子树的中序起始索引,就要用长度减去左子树结点个数和rootIndex指向的那个新根节点个数,即len - (rootIndex - in_low + 1)
return;
/*********************************/
}