ડꫀꫀ ꪗꪮꪊ. 2022-05-17 23:40 采纳率: 88.6%
浏览 69
已结题

C++ 二叉树的应用 出现了使用不完整的类型错误

img


#include <stdio.h>
#include <malloc.h>
#define MaxSize 100
typedef char ElemType;
typedef struct node
{
    ElemType data;            //数据元素
    struct node* lchild;    //指向左孩子结点
    struct node* rchild;    //指向右孩子结点
    int ltag, rtag;
} BTNode;

void InitBiTree(BTNode*& T)
{
    T=NULL;
}
void CreateBTree(BTNode*& b, char* str)    //创建二叉树
{
    BTNode* St[MaxSize], * p = NULL;
    int top = -1, k, j = 0;
    char ch;
    b = NULL;                //建立的二叉树初始时为空
    ch = str[j];
    while (ch != '\0')      //str未扫描完时循环
    {
        switch (ch)
        {
        case '(':top++; St[top] = p; k = 1; break;        //为左孩子结点
        case ')':top--; break;
        case ',':k = 2; break;                              //为孩子结点右结点
        default:p = (BTNode*)malloc(sizeof(BTNode));
            p->data = ch; p->lchild = p->rchild = NULL;
            if (b == NULL)                             //*p为二叉树的根结点
                b = p;
            else                                  //已建立二叉树根结点
            {
                switch (k)
                {
                case 1:St[top]->lchild = p; break;
                case 2:St[top]->rchild = p; break;
                }
            }
        }
        j++;
        ch = str[j];
    }
}
void DestroyBTree(BTNode*& b)    //销毁二叉树
{
    if (b != NULL)
    {
        DestroyBTree(b->lchild);
        DestroyBTree(b->rchild);
        free(b);
    }
}
BTNode* FindNode(BTNode* b, ElemType x) //查找值为x的结点
{
    BTNode* p;
    if (b == NULL)
        return NULL;
    else if (b->data == x)
        return b;
    else
    {
        p = FindNode(b->lchild, x);
        if (p != NULL)
            return p;
        else
            return FindNode(b->rchild, x);
    }
}
BTNode* LchildNode(BTNode* p)
{
    return p->lchild;
}
BTNode* RchildNode(BTNode* p)
{
    return p->rchild;
}
int BTHeight(BTNode* b)        //求二叉树b的高度
{
    int lchildh, rchildh;
    if (b == NULL) return(0);                 //空树的高度为0
    else
    {
        lchildh = BTHeight(b->lchild);    //求左子树的高度为lchildh
        rchildh = BTHeight(b->rchild);    //求右子树的高度为rchildh
        return (lchildh > rchildh) ? (lchildh + 1) : (rchildh + 1);
    }
}
void DispBTree(BTNode* b)  //以括号表示法输出二叉树
{
    if (b != NULL)
    {
        printf("%c", b->data);
        if (b->lchild != NULL || b->rchild != NULL)
        {
            printf("(");                        //有孩子结点时才输出(
            DispBTree(b->lchild);                //递归处理左子树
            if (b->rchild != NULL) printf(",");    //有右孩子结点时才输出,
            DispBTree(b->rchild);                //递归处理右子树
            printf(")");                        //有孩子结点时才输出)
        }
    }
}

void visite(BTNode* b)
{
    if (b == NULL)
        printf("The node does not exist");
    else
        printf("%c", b->data);
}
void printBiTree(BTNode* T, int level)
{
    if (T != NULL)
    {
        printBiTree(T->rchild, level + 1);
        if (level != 0)
        {
            for (int i = 0; i < 4 * (level - 1); i++)
            {
                printf("%s", "");
            }
            printf("%s", "---");
        }
        visite(T);
        printf("\n");
        printBiTree(T->lchild, level + 1);
    }
}




int leafNodes(BTNode* T)
{
    if (T == NULL)return 0;
    else if(T->lchild == NULL && T->rchild == NULL)return 1;
    else return leafNodes(T->lchild) + leafNodes(T->rchild);
}

int CountLeaf(BTNode*b)
{
    static int LeafNum = 0;//叶子初始数目为0,使用静态变量//静态局部变量,防止下一次被初始化
  
    if (b)//树非空
    {
        if (b->rchild == NULL && b->lchild == NULL)//为叶子结点
            LeafNum++;//叶子数目加1
         // else//不为叶子结点
        //  {
        CountLeaf(b->rchild);//递归统计左子树叶子数目
        CountLeaf(b->lchild);//递归统计右子树叶子数目
     //  }
    }
    return LeafNum;
}

void InOrderTraverse(BTNode* T)
{
    if (T != NULL)
    {
        InOrderTraverse(T->lchild);
            visite(T);
        InOrderTraverse(T->rchild);
    }
}




void LevelTraverse(BTNode* T)
{
    BTNode* p;
    BTNode* qu[MaxSize];
    int front, rear;
    front = rear = -1;
    rear++;
    qu[rear] = T;
    while (front != rear)
    {
        front = (front + 1) % MaxSize;
        p = qu[front];
        visite(p);
        if (p->lchild != NULL)
        {
            rear = (rear + 1) % MaxSize;
            qu[rear] = p->lchild;
        }
        if(p->rchild!=NULL)
        {
            rear = (rear + 1) % MaxSize;
            qu[rear] = p->rchild;
        }

    }
}


BTNode* pre;
void Thread(BTNode*& p)
{
    if (p != NULL)
    {
        Thread(p->lchild);
        if (p->lchild == NULL)
        {
            p->lchild = pre;
            p->ltag = 1;
        }
        else p->ltag = 0;
        if (pre->rchild == NULL)
        {
            pre->rchild = p;
            pre->rtag = 1;
        }
        else pre->rtag = 0;
        pre = p;
        Thread(p->rchild);
    }
 }

BTNode* CreaThread(BTNode* b)
{
    BTNode* root;
    root = (BTNode*)malloc(sizeof(BTNode));
    root->ltag = 0; root->rtag = 1; root->rchild = b;
    if (b = NULL)
        root->lchild = root;
    else{
        root->lchild = b;
    pre = root;
    Thread(b);
    pre->lchild = root;
    pre->rtag = 1;
    root->rchild = pre;
}
return root;
}
 
 

 





int main()
{
    BTNode* b, * p, * lp, * rp;;
    int level ;
    printf("二叉树的基本运算如下:\n");
    printf("  (1)创建二叉树\n");
    char str[] = "A(B(D,E(H(J,K))),C(,G))";
    CreateBTree(b, str);
    printf("  (2)输出二叉树:"); DispBTree(b); printf("\n");
    printf("  (3)H结点:");
    p = FindNode(b, 'H');
    if (p != NULL)
    {
        lp = LchildNode(p);
        if (lp != NULL)
            printf("左孩子为%c ", lp->data);
        else
            printf("无左孩子 ");
        rp = RchildNode(p);
        if (rp != NULL)
            printf("右孩子为%c", rp->data);
        else
            printf("无右孩子 ");
    }
    printf("\n");
    printf("  (4)二叉树b的高度:%d\n", BTHeight(b));
    printf("  (5)释放二叉树b\n");
    printf("(6)二叉树的叶子节点:%d\n", CountLeaf(b));
    /*printf("(7)横向输出二叉树:%d\n", printBiTree(b));*/
    printf("(8)所有叶子的节点个数:%d\n", leafNodes(b));
    printf("(9)中序遍历二叉树:%d\n", InOrderTraverse(b));
    printf("(10)层次遍历二叉树:%d\n", LevelTraverse(b));

    DestroyBTree(b);
    return 1;
}
  • 写回答

1条回答 默认 最新

  • 浪客 2022-05-18 01:13
    关注

    282,283行的函数没有返回值,没东西输出。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 10月17日
  • 已采纳回答 10月9日
  • 创建了问题 5月17日

悬赏问题

  • ¥15 fluent的在模拟压强时使用希望得到一些建议
  • ¥15 STM32驱动继电器
  • ¥15 Windows server update services
  • ¥15 关于#c语言#的问题:我现在在做一个墨水屏设计,2.9英寸的小屏怎么换4.2英寸大屏
  • ¥15 模糊pid与pid仿真结果几乎一样
  • ¥15 java的GUI的运用
  • ¥15 Web.config连不上数据库
  • ¥15 我想付费需要AKM公司DSP开发资料及相关开发。
  • ¥15 怎么配置广告联盟瀑布流
  • ¥15 Rstudio 保存代码闪退