用C语言实现二叉树的旋转平衡
我有一个二叉树,数据来自一个简单的列表,现在我需要平衡它,但它一直给我错误分割错误 我的余额代码是:用C语言实现二叉树的旋转平衡,c,binary-tree,C,Binary Tree,我有一个二叉树,数据来自一个简单的列表,现在我需要平衡它,但它一直给我错误分割错误 我的余额代码是: NodoAB * balance(NodoAB *A){ int D=0,E=0; if(A==NULL) return(NULL); if(fabs(countNodesAB(A->fe)-countNodesAB(A->fd))<=1) return (A); if(countNodesAB(A->fe)-countNodesAB(
NodoAB * balance(NodoAB *A){
int D=0,E=0;
if(A==NULL)
return(NULL);
if(fabs(countNodesAB(A->fe)-countNodesAB(A->fd))<=1)
return (A);
if(countNodesAB(A->fe)-countNodesAB(A->fd)<=-2){
D=countNodesAB(A->fd->fd);
printf("D:%d\n",D);
E=countNodesAB(A->fd->fe);
printf("E:%d\n",E);
if(E-D==1)
return(rotationLeft(A));
else{
A=rotationRight(A);
A->fd=rotationLeft(A->fd);
return(A);
}
}
}
计数节点:
int countNodesAB(NodoAB *A){
if(A==NULL)
return 0;
return(1+countNodesAB(A->fe)+countNodesAB(A->fd));
}
以下情况似乎可疑:
if(countNodesAB(A->fe)-countNodesAB(A->fd)<=2){
D=countNodes(A->fd->fd);
如果->fe有2个节点,而->fd有0个节点,那么我认为这意味着->fd为空,然后导致showns countNodes上的访问冲突调用->fd->fd将无效。请不要返回;!返回不是函数。@H2CO3。如果是的话,它就是结束所有函数的函数。@DanielFischer如果我感觉正确,我们在这里进入lambda演算…:P@H2CO3这也很好,但这是一个结束所有战争的双关语。@H2CO3,我完全同意返回语句中使用的值不应该包含在括号中,但是我会使用不同的理由,而不是它不是一个函数。sizeof和typeof都不是函数,但它们仍然经常与括号一起使用。我宁愿说这是一个风格的问题,在返回的情况下,风格指南倾向于说不要使用paren。然后我必须确保countNodesABA->fd=0?嗯。。。在取消引用指针之前,您需要确保A->fd不为NULL。我有一个疑问,我必须在树中插入节点时调用balance函数,对吗?从技术角度来看,可以随时平衡二叉树,当然要注意并发性问题。这将取决于应用要求。
if(countNodesAB(A->fe)-countNodesAB(A->fd)<=2){
D=countNodes(A->fd->fd);