对于这个问题的未来观众谁可能需要这类问题的帮助:我通过组合2个函数(InsertNode()和InTree())修复它我不确定这是不好的做法我和我#39;如果它确实解决了这个问题,或者它只是掩盖了它,那么我会回复你们,但它似乎正在起作用......
我已经在本网站(以及其他网站)上查看了各种答案,并从那些我得到的解决方案中找到了无用的帮助(尝试过但没有工作或只是没有做过#39; t与我的程序不同)。 插入函数(我已将其隔离并认为这是有问题的代码)在某处导致程序崩溃的某些错误。
NP InTree(NP Node,NP Root)
{
if (Root == NULL)
{
Root=Node;
return Root;
}
else
{
if (Node->Input < Root->Input)
{
return InTree(Node,Root->Left);
}
else if (Node->Input > Root->Input)
{
return InTree(Node,Root->Right);
}
else
{
puts("Duplicate");
return NULL;
}
}
}
void InsertNode(int I, TP Tree)
{
NP Node;
Node=(NP)malloc(sizeof(struct AVLNode));
InitializeNode(Node);
Node->Input=I;
Node->Height=0;
Node->Left=NULL;
Node->Right=NULL;
InTree(Node,Tree->Root);
Tree->Size++;
}
NP是节点指针,TP是树指针
Node变量是通过InsertNode()
发送的初始化节点void InitializeTree(TP Tree)
{
Tree->Root=NULL;
Tree->Size=0;
}
void InitializeNode(NP Node)
{
Node->Input=0;
Node->Height=0;
}
以上是我的初始化函数,以防您需要查看它们。
在调用任何函数之前,树的内存在主类中分配。
从我看到的测试中看到的主要问题是,一旦Root等于Node,它就会保持为空。
我有什么想法可以解决这个问题?
答案 0 :(得分:0)
void InsertNode(int I, TP Tree)
为新节点分配mem,但是当你调用NP InTree(NP Node,NP Root)
时,你只修改本地指针地址。您需要使用指向指针的指针(即NP InTree(NP Node, NP *ppRoot)
)或以下示例:
if (Node->Input < Root->Input) {
if(Root->Left == NULL) {
Root->Left = Node;
} else {
return InTree(Node,Root->Left);
}
} else if (Node->Input > Root->Input) {
if(Root->Right== NULL) {
Root->Right= Node;
} else {
return InTree(Node,Root->Right);
}
} else {
puts("Duplicate");
return NULL;
}
聚苯乙烯。我注意到你分配struct AVLNode ...是NP的AVLNode(typedef struct AVLNode* NP
)的typedef?我不知道你的结构是什么,所以我不能说。从技术上讲,AVL与B树的不同之处在于它们是自平衡的...... http://en.wikipedia.org/wiki/AVL_tree
答案 1 :(得分:0)
在InTree
函数中,Root
等于Node
,它只在本地更改内存。
相反,您可能需要使用指向指针的指针来实现您正在尝试的目标。
答案 2 :(得分:0)
我会这样做的。您的插入函数不区分特殊情况(空树)和一般情况(非空树)。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct NODE
{
struct NODE *left ;
struct NODE *right ;
int value ;
int depth ;
} NODE ;
typedef struct TREE
{
NODE *root ;
int count ;
} TREE ;
NODE *node_create( int value )
{
NODE *instance = (NODE*) calloc( 1 , sizeof(NODE) ) ;
instance->value = value ;
return instance ;
}
TREE *tree_create()
{
TREE *instance = (TREE*) calloc( 1 , sizeof(TREE) ) ;
return instance ;
}
NODE *tree_find_and_insert( NODE *parent , int value )
{
NODE *child = NULL ;
if ( value < parent->value )
{
if ( parent->left == NULL )
{
child = node_create(value) ;
child->depth = ++ parent->depth ;
parent->left = child ;
return child ;
}
else
{
return tree_find_and_insert(parent->left , value ) ;
}
}
else if ( value > parent->value )
{
if ( parent->right == NULL )
{
child = node_create(value) ;
child->depth = ++ parent->depth ;
parent->right = child ;
return child ;
}
else
{
return tree_find_and_insert( parent->right , value ) ;
}
}
else /* ( value == parent->value ) */
{
// NO-OP by design: dupes fall out and NULL is returned
}
return child ;
}
NODE *tree_insert( TREE *tree , int value )
{
NODE *inserted = NULL ;
if ( tree->root == NULL )
{
tree->root = node_create( value ) ;
tree->count = 1 ;
inserted = tree->root ;
}
else
{
inserted = tree_find_and_insert( tree->root , value ) ;
}
return inserted ;
}
int main ( int argc , char *argv[] )
{
TREE *my_tree = tree_create() ;
int i ;
for ( i = 1 ; i < argc ; ++i )
{
char *arg = argv[i] ;
int n = atoi(arg) ;
tree_insert( my_tree , n ) ;
}
return 0 ;
}