스택이 무작위로 삭제됩니다. TYPE (TYPE은 데이터의 typedef입니다.) 요소를 추가하고 제거 할 수있는 이진 트리가 있습니다. 그러나 어떤 이유로 인해 추가 된 특정 값은 이전 요소를 덮어 씁니다. 여기에 요소를 덮어 쓰지 않고 요소를 겹쳐 쓰지 않고 삽입하는 예가 나와 있습니다.이진 검색 트리에 노드를 임의로 추가하면 노드
데이터 내가 저장 해요 :
struct data {
int number;
char *name;
};
typedef struct data data;
# ifndef TYPE
# define TYPE data*
# define TYPE_SIZE sizeof(data*)
# endif
트리 구조체 : 데이터에 대한
struct Node {
TYPE val;
struct Node *left;
struct Node *rght;
};
struct BSTree {
struct Node *root;
int cnt;
};
비교기.
int compare(TYPE left, TYPE right) {
int left_len; int right_len; int shortest_string;
/* find longest string */
left_len = strlen(left->name);
right_len = strlen(right->name);
if(right_len < left_len) { shortest_string = right_len; } else { shortest_string = left_len; }
/* compare strings */
if(strncmp(left->name, right->name, shortest_string) > 1) {
return 1;
}
else if(strncmp(left->name, right->name, shortest_string) < 1) {
return -1;
}
else {
/* strings are equal */
if(left->number > right->number) {
return 1;
}
else if(left->number < right->number) {
return -1;
}
else {
return 0;
}
}
}
그리고 추가 방법
struct Node* _addNode(struct Node* cur, TYPE val) {
if(cur == NULL) {
/* no root has been made */
cur = _createNode(val);
return cur;
}
else {
int cmp;
cmp = compare(cur->val, val);
if(cmp == -1) {
/* go left */
if(cur->left == NULL) {
printf("adding on left node val %d\n", cur->val->number);
cur->left = _createNode(val);
}
else {
return _addNode(cur->left, val);
}
}
else if(cmp >= 0) {
/* go right */
if(cur->rght == NULL) {
printf("adding on right node val %d\n", cur->val->number);
cur->rght = _createNode(val);
}
else {
return _addNode(cur->rght, val);
}
}
return cur;
}
}
void addBSTree(struct BSTree *tree, TYPE val)
{
tree->root = _addNode(tree->root, val);
tree->cnt++;
}
새 노드 생성하는 방법 :
struct Node* _createNode(TYPE val) {
struct Node* new_node;
new_node = (struct Node*)malloc(sizeof(struct Node*));
new_node->val = val;
new_node->left = NULL;
new_node->rght = NULL;
return new_node;
}
기능은 트리 인쇄 : 여기
void printTree(struct Node *cur) {
if (cur == 0) {
printf("\n");
}
else {
printf("(");
printTree(cur->left);
printf(" %s, %d ", cur->val->name, cur->val->number);
printTree(cur->rght);
printf(")\n");
}
}
은 예입니다 덮어 쓸 데이터 일부 이전 요소 :
struct BSTree myTree;
struct data myData1, myData2, myData3;
myData1.number = 5;
myData1.name = "rooty";
myData2.number = 1;
myData2.name = "lefty";
myData3.number = 10;
myData3.name = "righty";
initBSTree(&myTree);
addBSTree(&myTree, &myData1);
addBSTree(&myTree, &myData2);
addBSTree(&myTree, &myData3);
printTree(myTree.root);
인쇄합니다 : 마지막으로 여기
((
righty, 10
)
lefty, 1
)
는 이전 데이터와 동일한 자리에 가서 몇 가지 테스트 데이터,하지만 이번에는 데이터가 덮어 쓰기되지 않습니다 :
struct BSTree myTree;
struct data myData1, myData2, myData3;
myData1.number = 5;
myData1.name = "i";
myData2.number = 5;
myData2.name = "h";
myData3.number = 5;
myData3.name = "j";
initBSTree(&myTree);
addBSTree(&myTree, &myData1);
addBSTree(&myTree, &myData2);
addBSTree(&myTree, &myData3);
printTree(myTree.root);
인쇄 어느 :
((
j, 5
)
i, 5 (
h, 5
)
)
누가 잘못 될지 알 수 있습니까? 죄송합니다.이 게시물이 길었습니다.
죄송합니다. 내 코드 덤프에 넣는 것을 잊었습니다. 내 편집을 참조하십시오. – SDLFunTimes