前序+中序=>构建二叉树

1.前序遍历数组中的第一个元素就是二叉树的根节点。 

2.根节点中序遍历数组从中间划分为左子树部分和右子树部分。

3.前序遍历数组中的左子树右子树的长度与中序遍历相同,于是也一分为二。

4.递归

5.(附加)前序+后序遍历数组是无法唯一确定一棵二叉树的,因为左子树与右子树的界限无法得知。

代码:

TreeNode* buildBinTree(const vector<int>& preOrder, int preFirst, int preLast,
	const vector<int>& inOrder, int inFirst, int inLast) {
	if (preFirst >= preLast || inFirst >= inLast) return nullptr;
	TreeNode* root = new TreeNode(preOrder[preFirst]);
	//寻找中序数组中根节点的位置
	//继而求出左子树和右子树的节点数
	vector<int>::const_iterator rootPosIte = find(inOrder.begin(), inOrder.end(), preOrder[preFirst]);
	int rootPos = distance(inOrder.begin(), rootPosIte);
	//递归构建左子树和右子树
	root->left = buildBinTree(preOrder, preFirst+1, preFirst+1+rootPos-inFirst, inOrder, inFirst, rootPos);
	root->right = buildBinTree(preOrder, preFirst+1+rootPos-inFirst, preLast, inOrder,rootPos+1, inLast);
	//返回根节点
	return root;
}
TreeNode* createBinTree(const vector<int>& preOrder, const vector<int>& inOrder) {
	return buildBinTree(preOrder, 0, preOrder.size(), inOrder, 0, inOrder.size());
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值