层序遍历+中序遍历构造二叉树

//思想是限制中序序列数组的上下限,而不限制层序序列的上下限,因为层序序列中越离根结点近的结点越先被访问,所以搜寻中序序列中第一个与层序序列中匹配的结点,这个结点就是根结点,然后同时也找到了这段中序序列的根结点的位置,那么他左边部分是它的左子树的中序序列,右边同理,递归循环传入参数限制左右子树的中序序列上下限,层序序列上下限依旧不变,这种思路应该时间复杂度比较高,后面有更好的算法会继续更新。

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

你可能感兴趣的:(算法-c++,算法,数据结构,二叉树,c++,递归法)