每日算法_编程之美_重建二叉树

前序的第一个节点为根节点,根节点将中序序列一分为二。

小心处理前序和中序的开始和结束节点,递归生成二叉树。

下图中a为根节点,1位左子树,2为右子树,每次迭代需重新找到子树的位置。


#include
   
   
    
    

using namespace std;

typedef struct node
{
public:
	node(char v)
	{
		val=v;
		left=NULL;
		right=NULL;
	}
	node* left;
	node* right;
	char val;	
};

node* reBuild(char* pre,int ps,int pe,char* in,int is,int ie)
{
	if(ps>pe or is>ie)return NULL;
	
	char val=pre[0];//前序第一个元素,将中序一分为二 
	node *root=new node(val);
	
	int mid=is;
	while(mid
    
    
     
     left = reBuild(pre+1,ps,mid-1,in,is,mid-1);
	root->right = reBuild(pre+mid+1,ps,pe-mid-1,in+mid,is,ie-mid-1);
	
	return root;
}


void visit(node* root)
{
	if(root==NULL)return;
	cout<
     
     
      
      val<<" ";
	visit(root->left);
	visit(root->right);
}



int main()
{
	char pre[6]={'a','b','d','c','e','f'};
	char in[6]={'d','b','a','e','c','f'};
	
	node* root;
	root = reBuild(pre,0,5,in,0,5);
	
	visit(root);
	
	
	return 0;
}
     
     
    
    
   
   

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值