/*
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;
}
}
POJ 1577(二叉树的前序遍历)
最新推荐文章于 2021-01-07 16:36:08 发布