鱼C论坛

 找回密码
 立即注册
查看: 2817|回复: 1

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

[复制链接]
发表于 2020-3-30 18:20:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

  3. #define MAXTSIZE 100;   //二叉树的最大结点数
  4. typedef char TElemType;
  5. //typedef TElemType SqBiTree[MAXSIZE];  //0号单元的储存根结点
  6. //ySqBiTree bt;

  7. typedef struct BiTNode
  8. {
  9.         TElemType data;  //结点数据域
  10.         struct BiTNode* lchild;
  11.         struct BiTNode* rchild;  //结点的指针域
  12. }BiTNode, * BiTree;

  13. //前序遍历建立二叉树
  14. void PreOrderCreatBiTree(BiTree* T)
  15. {
  16.         char ch;
  17.         scanf("%c", &ch);
  18.         if (ch == ' ')
  19.         {
  20.                 *T = NULL;
  21.         }
  22.         else
  23.         {
  24.                 *T = (BiTNode*)malloc(sizeof(BiTNode));
  25.                 (*T)->data = ch;
  26.                 PreOrderCreatBiTree(&(*T)->lchild);
  27.                 PreOrderCreatBiTree(&(*T)->rchild);
  28.         }
  29. }

  30. //前序遍历打印二叉树
  31. void PreOrderTarverse(BiTree T)
  32. {
  33.         if (T)
  34.         {
  35.                 printf("%c", T->data);
  36.                 PreOrderTarverse(T->lchild);
  37.                 PreOrderTarverse(T->rchild);
  38.         }
  39. }
  40. //中序遍历打印二叉树
  41. void InOrderTarverse(BiTree T)
  42. {
  43.         if (T)
  44.         {
  45.                 InOrderTarverse(T->lchild);
  46.                 printf("%c", T->data);
  47.                 InOrderTarverse(T->rchild);
  48.         }
  49. }
  50. //后序遍历打印二叉树
  51. void PostOrderTraverse(BiTree T)
  52. {
  53.         if (T)
  54.         {
  55.                 PostOrderTraverse(T->lchild);
  56.                 PostOrderTraverse(T->rchild);
  57.                 printf("%c", T->data);
  58.         }
  59. }
  60. //复制一颗二叉树
  61. void Copy(BiTree T, BiTree *NewT)
  62. {
  63.         if (T == NULL)
  64.         {
  65.                 *NewT == NULL;
  66.                 return;
  67.         }
  68.         else
  69.         {
  70.                 *NewT = (BiTNode *)malloc(sizeof(BiTNode));
  71.                 //* T = (BiTNode*)malloc(sizeof(BiTNode));
  72.                 (*NewT)->data = T->data;
  73.                 Copy(T->lchild, &(*NewT)->lchild);
  74.                 Copy(T->rchild, &(*NewT)->rchild);
  75.         }
  76. }
  77. //求深度
  78. int Depth(BiTree T)
  79. {
  80.         int m = 0;
  81.         int n = 0;

  82.         if (T == NULL)
  83.         return 0;
  84.         else
  85.         {
  86.                 m = Depth(T->lchild);
  87.                 n = Depth(T->rchild);
  88.         }
  89.         if (m > n)
  90.                 return (m + 1);
  91.         else
  92.                 return (n + 1);
  93. }
  94. //统计结点个数
  95. int NodeCount(BiTree T)
  96. {
  97.         if (T == NULL)
  98.         {
  99.                 return 0;
  100.         }
  101.         else
  102.         {
  103.                 return NodeCount(T->lchild) + NodeCount(T->rchild) + 1;
  104.         }
  105. }

  106. int main(void)
  107. {
  108.         BiTree T = NULL;
  109.         BiTree NewT = NULL;
  110.         int depth;
  111.         int NodeNum;
  112.         //BiTree pNewT;

  113.         printf("前序遍历创建二叉树,' '表示空:\n");
  114.         PreOrderCreatBiTree(&T);
  115.         printf("下面前序遍历打印二叉树:\n");
  116.         PreOrderTarverse(T);
  117.         printf("\n");
  118.         printf("下面中序遍历打印二叉树:\n");
  119.         InOrderTarverse(T);
  120.         printf("\n");
  121.         printf("下面后序遍历打印二叉树:\n");
  122.         PostOrderTraverse(T);
  123.         printf("\n");
  124.         printf("开始复制二叉数并前序遍历打印:\n");
  125.         Copy(T, &NewT);
  126.         PreOrderTarverse(NewT);
  127.         printf("下面计算二叉树的深度:\n");
  128.         depth = Depth(T);
  129.         printf("二叉树的深度为:%d", depth);
  130.         printf("\n下面统计二叉树中结点的个数:\n");
  131.         NodeNum = NodeCount(T);
  132.         printf("结点总结点个数为:%d", NodeNum);
  133.         return 0;
  134. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-30 18:34:10 | 显示全部楼层
解决了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-13 11:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表