C中的双指针AVL树

时间:2018-02-24 07:00:25

标签: c data-structures linked-list binary-tree avl-tree

我用指针练习我的AVL树。但是,如果我甚至不能制作一棵不平衡的树,我就无法继续平衡它。我认为我如何使用我的指针有问题。这是我的代码:

typedef struct structNode {
   int data;
   struct structNode *left;
   struct structNode *right;
   int height;
} sNode;

void createTree(sNode **node);
void insertNode(sNode **node, int num);

void main(){
   sNode * root = NULL;
   createTree(&root);
}

void createTree(sNode **root){
   int i, num, nodes;

   printf("\n\t\t\t\tNumber of nodes?\n");
   nodes = numScan(1,6);

   for(i=0;i<nodes;i++){
       num = numScan(1,100);
       insertNode(&*root,num);
   }


   printf("\n\n\t\t\t\tPress any key to continue.");
   getch();
}

void insertNode(sNode **root, int num){
   if(*root == NULL){
       sNode *node = malloc(sizeof(node));

       *root = node;

       node->data = num;
       node->left = NULL;
       node->right = NULL;
       node->height = 1;

       return;
   }

   sNode *node = *root;

   if(num < node->data){
       node->left = insertNode(&node->left, num); //void value not ignored as it ought to be
   }
   else
       node->right = insertNode(&node->right, num); //void value not ignored as it ought to be
   }
}

我的代码来自这个网站,但它不使用双指针,所以我有麻烦学习

网站:https://www.geeksforgeeks.org/avl-tree-set-1-insertion/

编辑:numScan(a,b)基本上只扫描一个字符串,如果它是一个数字数组,则计算出来,以便所有输入都是数字(所以没有输入字母或字符)。 num扫描(a和b)中的数字只是允许输入的数字范围。

1 个答案:

答案 0 :(得分:1)

正如duskwuff所说,这是一个简单的不平衡二叉树,而不是AVL。但是,您的代码并不是那么糟糕:

void createTree(sNode **pRoot){
   int i, num, nodes;

   printf("\n\t\t\t\tNumber of nodes?\n");
   nodes = numScan(1,6);

   for(i=0;i<nodes;i++){
       num = numScan(1,100);
       insertNode(pRoot,num); //Just pass the pRoot as it is
   }


   printf("\n\n\t\t\t\tPress any key to continue.");
   getch();
}

int insertNode(sNode **root, int num)
{   //returns the new height of *root
   if(*root == NULL){
       sNode *node = malloc(sizeof(node));

       *root = node;

       node->data = num;
       node->left = NULL;
       node->right = NULL;
       node->height = 1;

       return 1;
   }

   sNode *node = *root;
   int SubtreeHeight;

   if(num < node->data){
       SubtreeHeight = insertNode(&node->left, num); //child enters itself at &node->left if needed
   }
   else
       SubtreeHeight = insertNode(&node->right, num); 
   }
   if (SubtreeHeight>=node->height) //if new subtree is higher.. 
      node->height = SubtreeHeight + 1; //plus node itself
   return node->height;
} 
相关问题