当左右子树非空时且左子树值小于右子树值时交换左右子树

部分值无法交换
函数:
void swap(bitree *p)
{
if(p!=NULL && p->lchild!=NULL && p->rchild!=NULL)
{
bitree *s;
if(p->lchild->data < p->rchild->data)
{
s = p->lchild;
p->lchild = p->rchild;
p->rchild = s;
}
swap(p->lchild);
swap(p->rchild);
}
}

嵌套的swap函数要放到if外,否则只要中间有一个节点缺少左或右子树,那么左或右子树的左右子树就不会进行交换了

void swap(bitree *p)
{
     if(p!=NULL && p->lchild!=NULL && p->rchild!=NULL)
     {
           bitree *s;
           if(p->lchild->data < p->rchild->data)
           {
                s = p->lchild;
                p->lchild = p->rchild;
                p->rchild = s;
           }
     }
     swap(p->lchild);
     swap(p->rchild);
}


void swap(bitree *p)
{
    if(p!=NULL && p->lchild!=NULL )
    {
        bitree *s;
        if(p->rchild!=NULL)
        {
            if(p->lchild->data < p->rchild->data)
            {
                s = p->lchild;
                p->lchild = p->rchild;
                p->rchild = s;
            }    
        }    
    swap(p->lchild);
    swap(p->rchild);
    }
    
}

问题找到了,是判断语句出现逻辑错误,判断右孩子非空要放在大判断的里面