模板-根据先序遍历和中序遍历建立二叉树- HDU-1710-Binary Tree Traversals

#include <stdio.h>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
int t1[1000],t2[1000],count1=1;
typedef struct Tree_node{
	int data;
	struct Tree_node *lchild, *rchild;
}Tnode,*Tree;
void PTree_H(Tree T){
		if(T) 
		{
			PTree_H(T->lchild);
			PTree_H(T->rchild);
			if(count1) cout<<T->data,count1=0;
			else cout<<" "<<T->data;
		}
}
void Built(int i, int j, int i1 , int j1, Tree &T){   // i j  , i1 j1 是两数组的起始下标和结尾下标 通过不断更新它们的范围来判断是否有左右子树 
	int r;
	for(int k = i1; k <=j1; k++){
		if(t1[i] == t2[k])
		{
			r = k;
			break;
		}
	}
	T = new Tnode;    //分配空间      
	T->data = t2[r];   
	int l = r - i1;  // 此根节点的左子树的剩余节点数  
	if(l>0)    // 如果有左子树 
	    Built(i+1,j,i1,r-1,T->lchild); // i+1移至下一个根节点,并将j1移至r-1
	else T->lchild=NULL;  	
	if(r<j1)   // 如果有右子树 
	    Built(i+l+1,j,r+1,j1,T->rchild);//i+l+1,移至当前节点的右子树节点,将j移至r+1
	else T->rchild=NULL;
	return ; 
}	
int main()
{
	int a;
	while(cin>>a){
		count1 = 1;
		for(int i = 0; i < a; i++)
			cin>>t1[i];
		for(int i = 0; i < a; i++)
			cin>>t2[i];
		for(int i = 0;i < a; i++){
		}
		Tree T;
		Built(0, a-1,  0, a-1, T);
		PTree_H(T);
		cout<<endl;
	}
	return 0;
}
发布了52 篇原创文章 · 获赞 114 · 访问量 6024

猜你喜欢

转载自blog.csdn.net/GD_ONE/article/details/98313395
今日推荐