根据前序、中序序列重建一棵二叉树的代码实现

在这里插入图片描述

//根据前序、中序重建二叉树
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个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值