根据中序和前序遍历构建二叉树

面试题6:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历都不含重复的数字

BinaryTreeNode* constructCore(int* startPreOrder,int* endPreOrder,int* startInOrder,int* endInOrder){

	int rootValue = startPreOrder[0];
	BinaryTreeNode* root = new BinaryTreeNode();
	root->m_nValue = rootValue;
	root->m_pLeft=NULL;
	root->m_pRight=NULL;
	
	int* rootInorder=startInOrder;
	for(;*rootInorder!=rootValue&&rootInorder<=endInOrder;rootInorder++);

	if(rootInorder>endInOrder||*rootInorder!=rootValue){
		throw std::exception("invalid input");
	}
	//左子树长度
	int leftLength=rootInorder-startInOrder;
	int* leftPreOrderend=startPreOrder+leftLength;
	if(startPreOrder==endPreOrder){
		if(startInOrder==endInOrder&&*startInOrder==*startInOrder)
			return root;
		else 
			throw std::exception("Invalid Input!");
	}
	//构建左子树
	if(leftLength>0)
	root->m_pLeft = constructCore(startPreOrder+1,leftPreOrderend,startInOrder,rootInorder-1);
	//构建右子树
	if(leftLength<endInOrder-startInOrder)//右子树长度不为0
	root->m_pRight = constructCore(leftPreOrderend+1,endPreOrder,rootInorder+1,endInOrder);
	return root;

}
BinaryTreeNode* construct(int* preOrder,int* inOrder,int length){

	if(preOrder==NULL||inOrder==NULL||length<=0)return NULL;

	return constructCore(preOrder,preOrder+length-1,inOrder,inOrder+length-1); 

}
参考:剑指offer 何海涛

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值