2014-10-25 5 views
0

Я хочу определить общую структуру узлов для дерева двоичного поиска (BST) и дерева AVL. Для этого я определил следующую структуру в файле CommonNode.h.Общая структура узла для дерева двоичного поиска и дерева AVL

struct CommonNode{ 
int data; 
struct CommonNode *left, *right; 
}; 
typedef struct CommonNode node; 

в другом файле BST.h, я определил структуру для BST узла

struct bsTree{ 
node *nodePtr; 
}; 
typedef struct bsTree bst; 

В другом файле AVL.h, я определил структуру для AVL узла

struct AVLTree{ 
node *nodePtr; 
int balanceFactor; 
}; 
typedef struct AVLTree avl; 

Рассмотрите следующий код (код для поиска value на дереве)

avl *p; 
p = root; // assume that pointer to root is given 
while(p!=NULL){ 
    if(value < p->nodePtr->data) // value 
     p = p->nodePtr->left; 
    else 
     p = p->nodePtr->right; 
} 

Этот метод неправильный, так как p->nodePtr->left; указывает на структуру CommonNode и p является указателем на структуру AVLTree. Мой вопрос: каков правильный способ определения общей структуры узла для этой проблемы?

+1

http://en.wikipedia.org/wiki/AVL_tree и оттуда http://piumarta.com/software/tree/ – alk

+1

На 64-битной системы, в 'struct CommonNode' будет 32 бита заполнения. Вы могли бы также добавить «balanceFactor» в эту структуру и сэкономить все тошноту. В 32-битной системе это означало бы, что общие узлы используют 32-бит больше в BST, чем это минимально необходимо. Вам придется судить, для вас это проблема, но переход с одной структурой будет проще. Кроме того, как 'struct AVLTree', так и' struct bsTree' будут лучше удерживать 'struct CommonNode' напрямую, а не указатель на' struct CommonNode' - это совершенно ненужный уровень косвенности. –

+0

@JonathanLeffler Спасибо за совет, что имеет смысл – Hegde

ответ

0

Это может быть полезно для вас

#include<stdio.h> 
#include<malloc.h> 

struct CommonNode{ 
int data; 
struct CommonNode *left, *right; 
}; 

typedef struct CommonNode node; 

struct bsTree{ 
node *nodePtr; 
}; 

typedef struct bsTree bst; 

struct AVLTree{ 
node *nodePtr; 
int balanceFactor; 
}; 

typedef struct AVLTree avl; 


int main() 
{ 
avl *p; 
p = (struct AVLTree*)malloc(sizeof(struct AVLTree)); 
p->nodePtr = (node*)malloc(sizeof(node)); 
p->nodePtr->data = 20; 
printf("The data value is %d\n",p->nodePtr->data); 
return 0; 
} 


OUTPUT: 
The data value is 20 
+0

Проблема не в доступе к данным, а в указателе. 'p-> nodePtr-> left' указывает на' node', но я хочу, чтобы он указывал на 'struct AVLTree' – Hegde

+0

@Hegde, что вы сделали правильно. вы поместили общую вещь в одну структуру, а затем используете ее как для BST, так и для AVL. по вашему мнению, что-то вроде вложенной структуры. p-> nodePtr-> left указывает только на AVL. это что-то вроде в AVL, у вас есть структура CommonNode. –

Смежные вопросы