想飞的鱼丶 发表于 2020-3-30 18:20:57

二叉树基本操作,复制二叉树然后遍历打印新的二叉树出现了问题,求助

今天下午总结了一下二叉树的基本操作,但是在到了复制操作后,然后再打印新的二叉树,直接出现了程序崩溃,实在不知道为什么,进入调试会出现:引发了异常读取访问权限冲突 T是0xCDCDCDCD,求助啊。。
#include<stdio.h>
#include<stdlib.h>

#define MAXTSIZE 100;   //二叉树的最大结点数
typedef char TElemType;
//typedef TElemType SqBiTree;//0号单元的储存根结点
//ySqBiTree bt;

typedef struct BiTNode
{
        TElemType data;//结点数据域
        struct BiTNode* lchild;
        struct BiTNode* rchild;//结点的指针域
}BiTNode, * BiTree;

//前序遍历建立二叉树
void PreOrderCreatBiTree(BiTree* T)
{
        char ch;
        scanf("%c", &ch);
        if (ch == ' ')
        {
                *T = NULL;
        }
        else
        {
                *T = (BiTNode*)malloc(sizeof(BiTNode));
                (*T)->data = ch;
                PreOrderCreatBiTree(&(*T)->lchild);
                PreOrderCreatBiTree(&(*T)->rchild);
        }
}

//前序遍历打印二叉树
void PreOrderTarverse(BiTree T)
{
        if (T)
        {
                printf("%c", T->data);
                PreOrderTarverse(T->lchild);
                PreOrderTarverse(T->rchild);
        }
}
//中序遍历打印二叉树
void InOrderTarverse(BiTree T)
{
        if (T)
        {
                InOrderTarverse(T->lchild);
                printf("%c", T->data);
                InOrderTarverse(T->rchild);
        }
}
//后序遍历打印二叉树
void PostOrderTraverse(BiTree T)
{
        if (T)
        {
                PostOrderTraverse(T->lchild);
                PostOrderTraverse(T->rchild);
                printf("%c", T->data);
        }
}
//复制一颗二叉树
void Copy(BiTree T, BiTree *NewT)
{
        if (T == NULL)
        {
                *NewT == NULL;
                return;
        }
        else
        {
                *NewT = (BiTNode *)malloc(sizeof(BiTNode));
                //* T = (BiTNode*)malloc(sizeof(BiTNode));
                (*NewT)->data = T->data;
                Copy(T->lchild, &(*NewT)->lchild);
                Copy(T->rchild, &(*NewT)->rchild);
        }
}
//求深度
int Depth(BiTree T)
{
        int m = 0;
        int n = 0;

        if (T == NULL)
        return 0;
        else
        {
                m = Depth(T->lchild);
                n = Depth(T->rchild);
        }
        if (m > n)
                return (m + 1);
        else
                return (n + 1);
}
//统计结点个数
int NodeCount(BiTree T)
{
        if (T == NULL)
        {
                return 0;
        }
        else
        {
                return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
        }
}

int main(void)
{
        BiTree T = NULL;
        BiTree NewT = NULL;
        int depth;
        int NodeNum;
        //BiTree pNewT;

        printf("前序遍历创建二叉树,' '表示空:\n");
        PreOrderCreatBiTree(&T);
        printf("下面前序遍历打印二叉树:\n");
        PreOrderTarverse(T);
        printf("\n");
        printf("下面中序遍历打印二叉树:\n");
        InOrderTarverse(T);
        printf("\n");
        printf("下面后序遍历打印二叉树:\n");
        PostOrderTraverse(T);
        printf("\n");
        printf("开始复制二叉数并前序遍历打印:\n");
        Copy(T, &NewT);
        PreOrderTarverse(NewT);
        printf("下面计算二叉树的深度:\n");
        depth = Depth(T);
        printf("二叉树的深度为:%d", depth);
        printf("\n下面统计二叉树中结点的个数:\n");
        NodeNum = NodeCount(T);
        printf("结点总结点个数为:%d", NodeNum);
        return 0;
}

想飞的鱼丶 发表于 2020-3-30 18:34:10

解决了
页: [1]
查看完整版本: 二叉树基本操作,复制二叉树然后遍历打印新的二叉树出现了问题,求助