CODE:
int main(void) //AVL Tree
{
TP TreeP=(TP)malloc(sizeof(struct AVLTree)); //TP is a Pointer to a Tree Structure
InitializeTree(TreeP); //Initializes the Tree
FILE * FP;
int I=0;
FP = fopen("Data.txt", "r"); //Open the file stream
while(!feof(FP))
{
fscanf(FP,"%d",&I); //read integers from file
InTree(I,&(TreeP->Root),TreeP); //input those integers onto nodes, which are places on the tree
}
for (I=0;I<(TreeP->Size);I++)
{
SearchNode(&(TreeP->Root)); //searches for the first occurrence of a node disobeying the height balance condition
}
Traversal(&(TreeP->Root)); //traverse the Tree outputting all node in Pre Order
close(FP);
return 0;
}
void SearchNode(NP * Root)
{
if ((*Root)!=NULL) //first checks if the root exists
{
if (((*Root)->Left)!=NULL && (((*Root)->Right)!=NULL)) //then if it has left and right nodes
{
if(((*Root)->Left->Height) > (((*Root)->Right->Height)+1) || ((*Root)->Right->Height) > (((*Root)->Left->Height)+1)) //checks if they disobey the condition
{FindNode(Root);}
else //if they don't it continues to traverse the tree
{
SearchNode(&((*Root)->Left));
SearchNode(&((*Root)->Right));
}
}
}
}
//RR -> Right Right, LL -> Left Left, LR -> Left Right, RL -> Right Left
void rrBalance(NP * Root) //the rr and ll balancers simply change the pointers
{
NP * Temp= Root;
((*Root)->Right->Left)=((*Temp)->Right);
Root= &((*Root)->Right);
((*Root)->Right)=(*Temp);
puts("RRB"); //testing
}
void llBalance(NP * Root)
{
NP * Temp= Root;
((*Root)->Left->Right)=((*Temp)->Left);
Root= &((*Root)->Left);
((*Root)->Left)=(*Temp);
puts("LLB"); //testing
}
void rlBalance(NP * Root) //the double balancers run both an ll and an rr in different orders
{
rrBalance(&((*Root)->Right));
llBalance(Root);
puts("RLB"); //testing
}
void lrBalance(NP * Root)
{
llBalance(&((*Root)->Left));
rrBalance(Root);
puts("LRB"); //testing
}
void leftRebalance(NP * Root) //checks whether ll or lr balance
{
puts("LR"); //testing
if ((*Root)->Left->Height > (((*Root)->Right->Height)+1))
{llBalance(Root);}
else if ((*Root)->Right->Height > (((*Root)->Left->Height)+1))
{lrBalance(Root);}
}
void rightRebalance(NP * Root) //checks whether rr or rl balance
{
if((*Root)->Left->Height > (((*Root)->Right->Height)+1))
{rlBalance(Root);}
else if((*Root)->Right->Height > (((*Root)->Left->Height)+1))
{rrBalance(Root);}
puts("RR"); //testing purposes
}
void FindNode(NP * Root) //decides whether the node needs a right or left balance function by comparing the heights of the child nodes
{
if((*Root)->Left->Height > ((*Root)->Right->Height)+1)
{leftRebalance(&((*Root)->Left));}
else if ((*Root)->Right->Height > ((*Root)->Left->Height)+1)
{rightRebalance(&((*Root)->Right));}
puts("FindNode"); //placed to check whether the function was accessed - for testing purposes
}
- 如果代码显示不当,我很抱歉,我还是Stackoverflow的新手 - 没有包含遍历函数,因为虽然我的问题的一部分在遍历中,但代码工作正常,InTree()函数也是如此,它是用不同的问题编写的,现在工作正常。
问题:程序应该获取文件中的所有整数,将它们放在AVL树上,将它们重新排序为平衡的BST并再次输出。但是,在运行程序时,我的输出没有按预期返回。 我的第一次尝试返回树的前几个节点,然后停留在文件流中的值“76”,这是在无限循环中输出 看到我决定让它在76之前结束(在我的遍历中添加一个exit()函数),我看到输入仍未正确排序
文件输入:1,45,23,76,222,11,0,10,90,11,19,18,43,56,32,22,55,66,77,111,2,7, 88,100,445,667,89,99,455,677,200,23 计划外:1,0,45,23,11,10,2,7,19,18,22,43,32
对我来说,程序输出看起来不正确(什么让它离开的是1不应该是根)...我是如何重新排列指针的?另外,为什么无限循环?
注意:请不要评论我编码的语法是什么,当编译器没有返回任何语法错误时,我不能浪费任何时间进行轻微的重新调整