重建二叉树

struct TreeNode 
{
	int val;
	TreeNode *left;
    TreeNode *right;
    TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
以数组形式
前序和中序
TreeNode *pre_in_construct(vector<int> pre,int preleft,int preright,vector<int> vin,int vinleft,int vinright)
{
   int val=pre[preleft];
    TreeNode *root=new TreeNode(val);
    root->left=root->right=NULL;
    
    int pos;
    for(int i=vinleft;i<=vinright;i++)
    {
        if(vin[i]==val)
        {
            pos=i;
            break;
        }
    }
    
    int leftlength=pos-vinleft;
    if(leftlength>0)
    {
        root->left=pre_in_construct(pre,preleft+1,preleft+leftlength,vin,vinleft,pos-1);
    }
    
    if(leftlength<preright-preleft)
    {
        root->right=pre_in_construct(pre,preleft+leftlength+1,preright,vin,pos+1,vinright);
    }
    
    return root;
}
TreeNode* pre_in_ConstructBinaryTree(vector<int> pre,vector<int> vin) 
{

    if(pre.empty() || vin.empty())
    {
        return NULL;
    }
    return pre_in_construct(pre,0,pre.size()-1,vin,0,vin.size()-1);
}
后序和中序
TreeNode *in_ps_construct(vector<int> ps,int psleft,int psright,vector<int> vin,int vinleft,int vinright)
{
	int val=ps[psright];
	TreeNode *root=new TreeNode(val);
	root->left=root->right=NULL;

	int pos;
	for(int i=vinleft;i<=vinright;i++)
	{
		if(vin[i]==val)
		{
			pos=i;
			break;
		}
	}

	int leftlength=pos-vinleft;
	if(leftlength>0)
	{
		root->left=in_ps_construct(ps,psleft,psleft+leftlength-1,vin,vinleft,pos-1);
	}

	if(leftlength<psright-psleft)
	{
		root->right=in_ps_construct(ps,psleft+leftlength,psright-1,vin,pos+1,vinright);
	}

	return root;
}

TreeNode *in_ps_ConstructBinaryTree(vector<int> vin,vector<int> ps)
{
	if(vin.empty() || ps.empty())
	{
		return NULL;
	}

	return in_ps_construct(ps,0,ps.size()-1,vin,0,vin.size()-1);
}
主函数测试
int main() 
{
//前序
	int ar[]={1,2,4,7,3,5,6,8};
	int len1=sizeof(ar)/sizeof(ar[0]);
	
//中序
	int br[]={4,7,2,1,5,3,8,6};
	int len2=sizeof(br)/sizeof(br[0]);
	
//后序
	int cr[]={7,4,2,5,8,6,3,1};
	int len3=sizeof(cr)/sizeof(cr[0]);

	vector<int> pre(ar,ar+len1);
	vector<int> in(br,br+len2);
	vector<int> ps(cr,cr+len3);
	
	TreeNode* root1=pre_in_ConstructBinaryTree(pre,in);
	TreeNode *root2=in_ps_ConstructBinaryTree(in,ps);
	
    return 0;
}
以字符串形式
struct TreeNode 
{
	char val;
	TreeNode *left;
    TreeNode *right;
    TreeNode(char x) : val(x), left(NULL), right(NULL) {}
};
前序和中序
TreeNode *pre_in_construct(char *pre,char *vin,int n)
{
    
    TreeNode *root=NULL;
	if(n>0)
	{
		char val=*pre;
		root=new TreeNode(val);
        
		int pos=-1;
		for(int i=0;i<n;i++)
		{
			if(vin[i]==val)
			{
				pos=i;
				break;
			}
		}
		
		root->left=pre_in_construct(pre+1,vin,pos);
		
		root->right=pre_in_construct(pre+pos+1,vin+pos+1,n-pos-1);
	}  
	
    return root;
}
TreeNode* pre_in_ConstructBinaryTree(char* pre,char* vin) {

    if(pre==NULL || vin==NULL)
    {
        return NULL;
    }
    int n=strlen(vin);
    return pre_in_construct(pre,vin,n);
}
后序和中序
TreeNode *in_ps_construct(char* ps,char* vin,int n)
{

	TreeNode *root=NULL;
	if(n>0)
	{
		char val=ps[n-1];
		root=new TreeNode(val);

		int pos=-1;
		for(int i=0;i<n;i++)
		{
			if(vin[i]==val)
			{
				pos=i;
				break;
			}
		}

		root->left=in_ps_construct(ps,vin,pos);

		root->right=in_ps_construct(ps+pos,vin+pos+1,n-pos-1);
		
	}
	return root;
}

TreeNode *in_ps_ConstructBinaryTree(char *ps,char *vin)
{
	if(vin==NULL || ps==NULL)
	{
		return NULL;
	}
	int n=strlen(vin);
	return in_ps_construct(ps,vin,n);
}
主函数测试
int main() 
{
 //前序
	char ar[]="ABDGCEFH";
	
 //中序
	char br[]="DGBAECHF";
	
 //后序
	char cr[]="GDBEHFCA";


	TreeNode* root1=pre_in_ConstructBinaryTree(ar,br);

	TreeNode *root2=in_ps_ConstructBinaryTree(cr,br);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值