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;
}
若不改变内置函数,将直接生成以下内容
若有任何操作的疑问可以看文章 如何使用测试代码