根据先序和中序遍历重建二叉树

思路:

 关键在每次读取两个数组的范围问题:
in(中序遍历数组)的边界比较好确定:
有左子树时为[start2,i-1];
有右子树时为[i+1,end2]。
pre(先序遍历数组)的边界要根据in确定:
1)有左子树时根据aft和i求出左子树节点个数为:i-start2。所以pre的边界就要包括接下来的i-start2个节点,即:从start1+1到start1+(i-start2)此时综合in的边界为[start1+1,start1+i-start2,start2,i-1];

2)有右子树时也要根据aft和i求出左子树节点个数:i-start2。pre的边界就要跳过接下来的i-start2个已建立过的节点, 即:从start1+1+(i-start2)到end1,此时综合in的边界为[start1+i-start2+1,end1,i+1,end2];

同时还要注意两个数组不匹配的情况。

总之:在跳到右子树时一定要跨过前面已经建立过的左子树的节点,即使没有左子树(此时i-start2等于0)。

struct BinaryTreeNode
{
	int		m_nValue;
	BinaryTreeNode* m_pLeft;
	BinaryTreeNode* m_pRight;
};

BinaryTreeNode* ReBuild(int* pre,int*in,int start1,int end1,int start2,int end2)
{
	if((end1-start1)==0)
		assert(pre[start1]==in[start2]);
	
	if(end2<start2)
		return NULL;

	BinaryTreeNode* Temp_Node=new BinaryTreeNode();
	Temp_Node->m_nValue=pre[start1];
	Temp_Node->m_pLeft=NULL;
	Temp_Node->m_pRight=NULL;

	for(int i=start2;i<=end2&&in[i]!=pre[start1];i++)
		;

	assert(i<=end2);

	if (i>start2)
		Temp_Node->m_pLeft=ReBuild(pre,in,start1+1,start1+i-start2,start2,i-1);
	if (i<end2)
		Temp_Node->m_pRight=ReBuild(pre,in,start1+i-start2+1,end1,i+1,end2);

	return Temp_Node;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值