icoding测试代码--AVL添加

icoding的数据结构并没有一个测试代码,其都是直接编写一个函数的形式,因此很难知道自己的实际输出是什么。针对部分题目,我编写了一系列测试代码以供大家进行数据输出的测试。

node_t* avl_insert(node_t* root, int val)
{
   //TODO
}

请将您的函数代码复制到上述函数中,然后修改main函数的相关内容,完成测试样例的输入

这里确实想不到什么更好的检测方法了hhh

如果需要更多的函数,请将其他的函数写在邻近node_t* avl_insert(node_t* root, int val)的附近,且保证main函数在最后

打印树的代码源程序来自 打印树源程序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>


typedef struct node
{
    int val;
    struct node *left;
    struct node *right;
    struct node *parent;
    int height;
} node_t;

typedef node_t* P_Node;

int width,height;
//创建二叉平衡树
node_t* avl_insert(node_t *root, int val);
node_t* create_avl_tree(int val){
    node_t* root = (node_t*)malloc(sizeof(node_t));
    root->left = NULL;
    root->right = NULL;
    root->parent = NULL;
    root->height = 0;
    root->val = val;
    return root;
}
//从数组读取二叉平衡树
node_t* create_avl_tree_from_array(int *arr, int len){
    node_t* root = NULL;
    for(int i=0; i<len; i++){
        root = avl_insert(root, arr[i]);
    }
    return root;
}
//求深度
int DeepTree(P_Node T)
{
    if(!T)
    {
        return 0;
    }
    return DeepTree(T->left)>DeepTree(T->right)?DeepTree(T->left)+1:DeepTree(T->right)+1;
//关键代码:如果该节点的左子树深度大于右子树则将左子树的深度加一返回,这个返回值便是以该节点做根节点的树的深度,右子树深度大时则相反
}

//T为二叉树的根节点,a是数组的起始地址,i,j是当前节点在数组中的位置
//如果节点有孩子,其孩子的j坐标为 j±(height-i+1)/2
void fillArray(P_Node T,char *a,int i, int j)
{
    int ti,tj;
    if(T) //如果该位置有节点
    {
        *(a+(i*width)+j) = T->val; //向数组该点填入字符
        if(T->left) //有左右孩子给对应的连接线,左右孩子的值在下一层递归赋
        {
            //将该点与其左孩子之间的连线全部填上'/'
            for(ti=i+1,tj=j-1;tj>j-(height-i+1)/2;tj--)
            {
                *(a+((ti)*width)+tj) = -1;
                ti++;
            }
        }
        if(T->right)
        {
            for(ti=i+1,tj=j+1;tj<j+(height-i+1)/2;tj++)
            {
                *(a+((ti)*width)+tj) = 1;
                ti++;
            }
        }
        //经过循环,ti恰好指到其孩子所在的层
        fillArray(T->left, a, ti, j-(height-i+1)/2);
        fillArray(T->right, a, ti, j+(height-i+1)/2);
    }
}

void printBiTree(P_Node T)
{
    int i,j;
    int n = DeepTree(T); //计算出深度n
    //在计算机中数据以二进制形式存储,所以一个数据左移1位就相当于乘以2的1次方
    width = (2<<n)-3;  // 2^(n+1)-3
    height = (2<<(n-1))-1; // 2^n-1
    char *a = (char *)malloc(sizeof(char) * (width*height)); // 申请空间
 
    // 空间初始化为0
    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        {
            *(a+(i*width)+j) = 0;
        }
    }
 
    //调用之前定义好的函数,填充打印数组
    fillArray(T, a, 0, (width-1)/2);
 
    //根据打印数组的内容来实现打印
    for(i=0;i<height;i++)
    {
        for(j=0;j<width;j++)
        {
            if(*(a+(i*width)+j) == -1)
            {
                printf("/");
            }else if(*(a+(i*width)+j) == 1)
            {
                printf("\\");
            }else if(*(a+(i*width)+j) == 0)
            {
                printf(" ");
            }else
            {
                printf("%d", *(a+(i*width)+j));
                
            }
        }
        printf("\n");
    }
}
//以上为辅助函数/

node_t* avl_insert(node_t* root, int val)
{
   //TODO
}




int main(){
//----以 下 内 容 可 以 修 改------
    int arr[]={2,3,4,5,6};
    //用以生成AVL平衡树的数组
    //检测方法:若生成的子树满足AVL条件(bf绝对值小于等于1),则说明插入操作正确
    //函数会循环调用insert_AVL函数,直到插入完所有结点
    //所有数据必须<=128才有效,否则打印可能出错    

    //但是icoding并不检测height和parent的正确性。但如果不更新parent和height,在这里可能会出现错误
//----以 上 内 容 可 以 修 改------
    printf("----开始测试----\nicoding \nAVL 添加:\n");
    int len=sizeof(arr)/sizeof(arr[0]);
    node_t* root = create_avl_tree_from_array(arr, len);
    printf(">>生成的AVL树如下\n");
    printBiTree(root);
    printf("请自行检测所有节点均满足平衡因子绝对值小于等于1\n");
    printf("\n----测试结束----\n");
    return 0;

}

若不改变内置函数,将直接生成以下内容

若有任何操作的疑问可以看文章 如何使用测试代码 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

谨慎谦虚

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值