重建二叉树

题目:输入某二叉树的前序遍历和中序遍历的结果 请重建出该二叉树 假设输入的前序遍历和中序遍历的结果中都不含重复的数字 例如输入的前序遍历{1,2,4,7,3,5,6,8,}和

中序遍历{4,7,2,1,5,3,8,6} 则重建出来的二叉树如图所示 并输出他们的头结点 二叉树的节点定义如下




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


在二叉树的前序遍历序列中 第一个数字总是树根节点的值

但是在中序遍历中 根节点的值在序列的中间 左子树的节点值位于根节点的值的左边 而右子树位于根节点的右边 因此需要扫描中序遍历 才能找到根节点的值  根节点的前一个节点为左孩子 后一个节点 为右孩子  因此我们可以构建出 当前节点的左右孩子 然后找出左右子树 用同样的方法去构造左右子树

#include <iostream>
using namespace std;
struct BinaryTreeNode
{
	int m_nValue;
	BinaryTreeNode * m_pLeft;
	BinaryTreeNode * m_pRight;
};
BinaryTreeNode *construct(int *p,int *pend,int *s,int *send)
{
	BinaryTreeNode *root=new BinaryTreeNode();
	int rvalue=p[0];
	root->m_nValue=rvalue;
	root->m_pLeft=root->m_pRight=NULL;
	if(p== pend)
	{
		if( send==s && *s==rvalue)
			return root;
		else
			throw std::exception("Error ~!");
	}
	int *templeft=s;
	while ( *templeft!=rvalue && templeft <=send )
		templeft++;
	if(templeft==send &&  *templeft !=rvalue)
		throw std::exception("Error~!");
	int left=templeft-s;
	int *leftend=p+left;
	if(left>0)
		root->m_pLeft=construct(p+1,leftend,s,templeft-1);

	if(left<send-s)
		root->m_pRight=construct(leftend+1,pend,templeft+1,send);
	return root;
}
BinaryTreeNode * rebulid(int *p,int *s,int n)
{
	if (p==NULL || s==NULL || n==0)
		return 0;
	else
		return construct(p,p+n-1,s,s+n-1);
}
void vist(BinaryTreeNode *p)
{
	if(p!=NULL)
		cout<<p->m_nValue<<' ';
	if(p->m_pLeft!=NULL)vist(p->m_pLeft);
	if(p->m_pRight!=NULL)vist(p->m_pRight);
}
int main()
{
	int a[]={1,2,4,7,3,5,6,8};
	int b[]={4,7,2,1,5,3,8,6};
	int n=8;
	
	BinaryTreeNode *p=new BinaryTreeNode();
	p=rebulid(a,b,n);
	vist(p);
	return 0;
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值