Winder 养了一群会报数的鼹鼠,而且 Winder 喜欢用数字给他的鼹鼠们编号,如“ 311”、
“ 1048”等。当然,为了不混淆,鼹鼠们的编号都是不同的。为了锻炼鼹鼠们的身体健康,
Winder 决定让鼹鼠们进行掘土训练,顺便提高鼹鼠们的挖掘能力。
鼹鼠们排成一列,由第一个开始向下挖洞,并待在洞中。第二只与第一只相比,若编号
值大的鼹鼠,则向右下方挖洞, 否则向左下方。接下来的鼹鼠们以此类推,若比洞中所在鼹
鼠编号值,则向右下方走,否则向左下方。
训练结束后, Winder 会让他的鼹鼠们报数(既报出各自的编号)。通过报数的序列 Winder
想知道经过训练之后,鼹鼠们的位置是怎样的。
报数规则为:如果 A 鼹鼠的下方分别存在 ALeft 鼹鼠和 Aright 鼹鼠,则 ALeft 鼹鼠在
Aright 鼹鼠之前报数, Aright 鼹鼠在 A 鼹鼠之前报数。
位置表达式规则为:“根节点<左子树表达式><右子树表达式>” ,如左子树不存在,则只
输出“根节点<右子树表达式>”,右子树同理。
例如上图, 报数顺序为 2, 4, 7, 5, 3 可以表示为 3<2><5<4><7>>
★数据输入
第一行为 N( 2<N<=1000) .表示有 N 只鼹鼠。
第二行为 N 个整数 bi( 0<bi<10000),表示报数顺序。
★数据输出
输出鼹鼠们的位置表达式。
输入示例 输出示例
5 3<2><5<4><7>>
2 4 7 5 3
#include <stdio.h>
#include <stdlib.h>
#include<malloc.h>
typedef struct NODE
{
int data;
NODE *left;
NODE *right;
}*PNODE, NODE;
//建树
PNODE CreateTree(int arr[], int len)
{
PNODE root = NULL;
PNODE tmp = root;
for(int i = (len-1); i >=0; i--)
{
if(root == NULL)
{
root = new NODE;
root->data = arr[i];
root->left = NULL;
root->right = NULL;
}
else
{
tmp = root;
PNODE current = tmp;
while((arr[i] > tmp->data && tmp->right != NULL) || (arr[i] < tmp->data && tmp->left != NULL))
{
if(arr[i] > tmp->data)
tmp = tmp->right;
else
tmp = tmp->left;
current = tmp;
}
PNODE newNode = new NODE;
newNode->data = arr[i];
newNode->left = NULL;
newNode->right = NULL;
if(arr[i] > current->data)
current->right = newNode;
else
current->left = newNode;
newNode = NULL;
current = NULL;
}
}
tmp = NULL;
return root;
}
void DestroyTree(PNODE root)
{
if(root!= NULL)
{
DestroyTree(root->left);
DestroyTree(root->right);
delete root;
root = NULL;
}
}
//前序遍历
void Show(PNODE T){
if(T)
{
printf("%d",T->data);
if(T->left!=NULL){
printf("<");
Show(T->left);
printf(">");
}
if(T->right!=NULL){
printf("<");
Show(T->right);
printf(">");
}
}
}
int main(int argc, char **argv)
{
int N;
int *arr;
scanf("%d",&N);
arr=(int*)malloc(N*sizeof(int));
for(int g=0;g<N;g++)
scanf("%d",&arr[g]);
PNODE parent = CreateTree(arr, N);
Show(parent);
DestroyTree(parent);
parent = NULL;
return 0;
}