//思想是限制中序序列数组的上下限,而不限制层序序列的上下限,因为层序序列中越离根结点近的结点越先被访问,所以搜寻中序序列中第一个与层序序列中匹配的结点,这个结点就是根结点,然后同时也找到了这段中序序列的根结点的位置,那么他左边部分是它的左子树的中序序列,右边同理,递归循环传入参数限制左右子树的中序序列上下限,层序序列上下限依旧不变,这种思路应该时间复杂度比较高,后面有更好的算法会继续更新。
BTNode* CreateBTree(ElementType level[], ElementType in[], int l1, int r1, int l2, int r2)
{
if (l2 > r2)
{
return NULL;
}
else
{
BTNode* bt = (BTNode*)malloc(sizeof(BTNode));
int i, j;//分别指向level和in中数组的元素
int flag = 0;
//寻找根结点,若level中第一个与in中元素匹配的即为根结点
for (i = l1; i <= r1; ++i)
{
for (j = l2; j <= r2; ++j)
{
if (level[i] == in[j])
{
flag = 1;
break;
}
}
if (flag == 1)
break;
}
bt->data = level[i];
bt->lchild = CreateBTree(level, in, l1 + 1, r1, l2, j - 1);
bt->rchild = CreateBTree(level, in, l1 + 1, r1, j + 1, r2);
return bt;
}
}
代码直接拿的这位大佬的:
https://blog.csdn.net/weixin_42545675/article/details/103337658