POJ 1577(二叉树的前序遍历)

/*
	time : 0ms;
	memory : 168k;
	author : 久里克(QQ: 71029811) 
	简单题: 有一个难点,
	难点: 有一些点的rank,会和输入的rank不太一样,所以你的程序要去处理这个,比如,rank 为3 的点会连上rnak 为1 的点;
	有一些简短的代码;但我写的有点长;
	思路,节点的数量,被字母表给限制死了,所以最多只能有26个节点;
		那就先创建26个节点指针;
		再用这26个指针,接收数据,同时,以第几次输出为rank,放到节点里面,表明这个节点的rank;
		然后从上向下找,用前序顺序; 
		一:先找到根节点,
		二:再以根节点,为中心,向两边找二个rnak少一的节点, 再以此节点,为根节点,执行第一步,如是没适合的节点; 
			那就降一级rank,再找,直到rank为0; 
	 
*/ 
#include <iostream>
#include <cstring>
using namespace std;
typedef struct node{
	char data;
	int rank;
	node * left;
	node * right;
	node()
	{
		rank = -1;
		data = 0;
		left = NULL;
		right = NULL;
	}
} node;
node *sign[26];
int flag[26];
int rankcnt = 1;
node * root;
//利用根节点,来创建一棵树,注意是前序遍历的顺序,传值时,要传低位,和高位,还有RANK,; 
void creatTree(node *temp, int index, int low, int high, int rank){		
	int i = 0,right=-1, left=-1;	
	int Rrank, Lrank;
	Rrank = Lrank = rank;	
	while(Lrank > 0 && left == -1){	
		for(i=index-1; i>=low; --i){			
			if(sign[i]!=NULL && sign[i]->rank == Lrank){
				sign[index]->left = sign[i];
				flag[i] = 0;			
				left = i;
				break;
			}
		}
		if(left == -1)
			--Lrank;
	}
	while(Rrank > 0 && right == -1){	
		for(i=index; i<=high; ++i){				
			if(sign[i] != NULL && sign[i]->rank == Rrank ){	
				sign[index]->right = sign[i];
				flag[i] = 0;
				right = i;
				break;
			}
		}
		if(right == -1)
			--Rrank;
	}		
	if(left > -1){		
		printf("%c", 'A'+left);
		creatTree(sign[left], left, low, index, Lrank-1);
	}
	if(right > -1){		
		printf("%c", 'A'+right);
		creatTree(sign[right], right, index, high, Rrank-1);	
	}
}
//找到根节点; 
void outPreOrder(){	
	--rankcnt;
	node * temp;
	int index;	
	for(int i=0; i<26; ++i){		
		if(sign[i]!=NULL &&  sign[i]->rank == rankcnt){			
			flag[i] = 0;
			root = sign[i];
			index = i;
			printf("%c", 'A'+i);
			break;
		}		
	}
	--rankcnt;
	temp = root;	
	creatTree(temp, index, 0, 25, rankcnt);		
}
//第一组数据,初始化; 
void init(){
	for(int i=0; i<26; ++i){
		sign[i] = NULL;	
		flag[i] = 0;	
	}
	rankcnt = 1;
	root = NULL;
}
int main(){	
	char str[26];
	int i,j,k;
	//输入数据; 
	while(1){
		scanf("%s", str);		
		int len = strlen(str);		
		if(str[0] == '*'){
			outPreOrder();
			printf("\n");
			init();			
			continue;;		
		}
		if(str[0] == '$'){
			outPreOrder();
			break;
		}
		for(i=0; i<len; ++i){
			int index = str[i]-'A';
			flag[index] = 1;
			sign[index] = new node();
			sign[index]->data = str[i];
			sign[index]->rank = rankcnt;
		}
		++rankcnt;
	}
} 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值