[英]C program: Binary tree
我在創建二進制樹程序時需要一些幫助。 基本上,我有不同的方法來創建和使用二叉樹表(插入,查找等)。 這些方法是從其他類調用的。 現在,我認為我的插入功能無法正常工作,因為當我打印表格時,它僅顯示樹的最后一個節點。
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define __USE_BSD
#include <string.h>
#include "speller.h"
#include "dict.h"
typedef struct node *tree_ptr;
struct node {
Key_Type element; // only data is the key itself
tree_ptr left, right;
// add anything else that you need
};
struct table {
tree_ptr head; // points to the head of the tree
// add anything else that you need
};
Table initialize_table(/*ignore parameter*/) {
Table newTable = malloc(sizeof(Table));
newTable->head = NULL;
return newTable;
}
void insert_again(Key_Type key, tree_ptr node) {
Key_Type currentKey = node->element;
//printf("%s\n%s", currentKey, key);
int keyCompare = strcmp(key, currentKey);
// Move to the left node.
if (keyCompare < 0) {
//printf("%s\n%s", currentKey, key);
// If left node is empty, create a new node.
if (node->left == NULL) {
tree_ptr newPtr = malloc(sizeof(tree_ptr));
newPtr->element = key;
newPtr->left = NULL;
newPtr->right = NULL;
node->left = newPtr;
} else {
insert_again(key, node->left);
}
}
// Move to the right node.
else if (keyCompare > 0) {
//printf("%s\n%s", currentKey, key);
// If right node is empty, create a new node.
if (node->right == NULL) {
tree_ptr newPtr = malloc(sizeof(tree_ptr));
newPtr->element = key;
newPtr->left = NULL;
newPtr->right = NULL;
node->right = newPtr;
} else {
insert_again(key, node->right);
}
}
}
Table insert(Key_Type key, Table table) {
// if it's a new tree.
if (table->head == NULL) {
tree_ptr headPtr = malloc(sizeof(tree_ptr));
headPtr->element = key;
headPtr->left = NULL;
headPtr->right = NULL;
table->head = headPtr;
//printf("%s", table->head->element);
}
// if the tree already exists
else {
//printf("%s", table->head->element);
insert_again(key, table->head);
}
//printf("%s", table->head->element);
return table;
}
Boolean find_key(Key_Type key, tree_ptr node) {
Key_Type currentKey = node->element;
int keyCompare = strcmp(key, currentKey);
if (node != NULL) {
if (keyCompare == 0) {
return TRUE;
} else
if (keyCompare == -1) {
return find_key(key, node->left);
} else {
return find_key(key, node->right);
}
} else {
return FALSE;
}
}
Boolean find(Key_Type key, Table table) {
return find_key(key, table->head);
}
void print_tree(tree_ptr node) {
if (node == NULL) {
return;
}
print_tree(node->left);
printf("%s\n", node->element);
print_tree(node->right);
}
void print_table(Table table) {
print_tree(table->head);
}
void print_stats(Table table) {
}
您必須搜索一個空的子節點才能將新節點插入樹中。 使用指向指針的指針來注意空子節點。 除此之外,您還必須像以前那樣為sizeof(struct node)
分配內存,而不是為sizeof(struct node*)
分配內存。 就我所看到的代碼而言, Key_Type
類型為char*
。 因此,您必須使用strcmp
比較鍵,並且必須分配內存並將鍵復制到節點中。
Boolean insert( Key_Type key, Table table )
{
tree_ptr *ppNode = &(table->head); // pointer to pointer to node (struct node **)
while ( ppNode != NULL )
{
int keyCompare = strcmp( key, (*ppNode)->element );
if ( keyCompare == 0 )
return FALSE; // element with key is already member of tree
if ( keyCompare < 0 )
ppNode = &((*ppNode)->left); // go to left child
else
ppNode = &((*ppNode)->right); // go to right child
}
// now ppNode is either a pointer to an empty child pointer,
// or to table->head if the tree is empty
*ppNode = malloc( sizeof(struct node) ); // allocate new node right to target
(*ppNode)->left = NULL;
(*ppNode)->right = NULL;
(*ppNode)->element = malloc( strlen(key) + 1 );
strcpy( (*ppNode)->element, key );
return TRUE; // new node added successfully
}
查找具有key
的節點類似於查找空的子指針:
Boolean find_key( Key_Type key, Table table )
{
tree_ptr pNode = table->head;
while ( ppNode != NULL )
{
int keyCompare = strcmp( key, pNode->element );
if ( keyCompare == 0 )
return TRUE; // element with key was found
if ( keyCompare < 0 )
pNode = pNode->left; // go to left child
else
pNode = pNode->right; // go to right child
}
return FALSE; // key is not member of tree
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.