鼹鼠报数

★实验任务
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;
}
       

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值