鱼C论坛

 找回密码
 立即注册
查看: 2673|回复: 13

为什么我的数组定义了12个数,它还会变成24个数呢?

[复制链接]
发表于 2014-4-29 13:53:15 | 显示全部楼层 |阅读模式
5鱼币
本帖最后由 a372187663 于 2014-4-29 14:30 编辑

1.jpg
如图
求解释!!

//已知中序序列和后序序列,建立一颗二叉树

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 12

typedef char ElemType;

ElemType pmid[N] = {'G','D','J','H','K','B','E','A','C','F','M','I'}; //中序序列

ElemType post[N] = {'G','J','K','H','D','E','B','M','I','F','G','A'}; //后序序列

typedef struct BiTNode
{
        char data;
        struct BiTNode *lchild, *rchild;
} BiTNode, *BiTree;

int FindPos(char x,char pmid[]) //从start处开始查找
{
        int i;
        for(i = N;i >= 0;i--)
        {
                if(x == pmid[i])
                {  
                            return i; //返回中序根节点位置
                }

        }

        return 0;
}

void CreatBiTree_pmid_post(BiTree *T,int i,int j,int len) //i为mid[]中的首字符下标,j为post[]中的尾字符下标,len为子树字符串长度
{
        int m;
        int leftlen,rightlen;
        if(len <= 0)
        {
                (*T) = NULL;
        }
        else
        {
                (*T) = (BiTree)malloc(sizeof(BiTree));
                (*T)->data = post[j];
                m = FindPos(post[j],pmid);// 小于m的是左孩子,大于m的是右孩子
                printf("根节点位于第%d个字符,元素为%c\n",m+1,pmid[m]);
                    leftlen = m - i; //以m为根,左孩子的长度
                rightlen = len - leftlen -1;//以m为根,右孩子的长度

                CreatBiTree_pmid_post(&(*T)->lchild,i,j-1-rightlen,leftlen);
                CreatBiTree_pmid_post(&(*T)->rchild,m+1,j-1,rightlen);
        }
}

void exchange(BiTree T)
{
        BiTree p;
        if(T)
        {
                p = T->lchild;
                T->lchild = T->rchild;
                T->rchild = p;
                exchange(T->lchild);
                exchange(T->rchild);
        }
}


void copyTree(BiTree T,BiTree *S) //递归复制一颗二叉树
{
        if(!T)
        {
                *S = NULL;
        }
        else
        {
                (*S) = (BiTree)malloc(sizeof(BiTree));
                (*S)->data = T->data;
                copyTree(T->lchild,&(*S)->lchild);
                copyTree(T->rchild,&(*S)->rchild);
        }
}

void visit(char c)
{
        printf("%c", c);
}

void PreOrderTraverse(BiTree T,int level)
{
        if( T )
        {
                visit(T->data);
                PreOrderTraverse(T->lchild,level+1);
                PreOrderTraverse(T->rchild,level+1);
        }
}

int main()
{
        int level = 1;
        BiTree T = NULL;
        BiTree S;
      int  i,j,s,f;
      printf("中序序列为:\n");
      for(i = 0;i<N;i++)
      {
              printf("%c",pmid[i]);
      }
      printf("\n");
      printf("后序序列为:\n");
      for(j = 0;j<N;j++)
      {
              printf("%c",post[j]);
      }
      printf("\n");

        s = strlen(pmid);
        f = strlen(post);
      CreatBiTree_pmid_post(&T,0,N-1,s);
      printf("创建后前序遍历为:\n");
      PreOrderTraverse(T,level);
      printf("\n");

        exchange(T);
        printf("交换后前序遍历为:\n");
        PreOrderTraverse(T,level);
        printf("\n");

        copyTree(T,&S);
        printf("复制后:\n");
        PreOrderTraverse(T,level);
        printf("\n");

      return 0;
}


源代码

最佳答案

查看完整内容

我觉得是算法问题,表示自己修改。。。你可以先运行一次看看{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-29 13:53:16 | 显示全部楼层

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define N 13 // 结束符

  5. typedef char ElemType;

  6. ElemType pmid[N] = {'G','D','J','H','K','B','E','A','C','F','M','I'}; //中序序列

  7. ElemType post[N] = {'G','J','K','H','D','E','B','M','I','F','G','A'}; //后序序列

  8. typedef struct BiTNode
  9. {
  10.         char data;
  11.         struct BiTNode *lchild, *rchild;
  12. } BiTNode, *BiTree;

  13. int FindPos(char x,char pmid[]) //从start处开始查找
  14. {
  15.         int i;
  16.         for(i = N;i >= 0;i--)
  17.         {
  18.                 if(x == pmid[i]) // 不得不服啊,[i]这个能漏?
  19.                 {  
  20.                         return i; //返回中序根节点位置
  21.                 }
  22.                
  23.         }
  24.        
  25.         return 0;
  26. }


  27. // 这里就有问题了。。。
  28. void CreatBiTree_pmid_post(BiTree *T,int i,int j,int len) //i为mid[]中的首字符下标,j为post[]中的尾字符下标,len为子树字符串长度
  29. {
  30.         int m;
  31.         int leftlen,rightlen;
  32.         if(len <= 0)
  33.         {
  34.                 (*T) = NULL;
  35.         }
  36.         else
  37.         {
  38.                 (*T) = (BiTree)malloc(sizeof(BiTree));
  39.                 (*T)->data = post[j];

  40.                 m = FindPos(post[j],pmid);// 小于m的是左孩子,大于m的是右孩子
  41.                 printf("根节点位于第%d个字符,元素为%c\n",m+1,pmid[m]);

  42.                 leftlen = m - i; //以m为根,左孩子的长度
  43.                 rightlen = len - leftlen -1;//以m为根,右孩子的长度
  44.                
  45.                 CreatBiTree_pmid_post(&(*T)->lchild,i,j-1-rightlen,leftlen);
  46.                 CreatBiTree_pmid_post(&(*T)->rchild,m+1,j-1,rightlen);
  47.         }
  48. }

  49. void exchange(BiTree T)
  50. {
  51.         BiTree p;
  52.         if(T)
  53.         {
  54.                 p = T->lchild;
  55.                 T->lchild = T->rchild;
  56.                 T->rchild = p;
  57.                 exchange(T->lchild);
  58.                 exchange(T->rchild);
  59.         }
  60. }


  61. void copyTree(BiTree T,BiTree *S) //递归复制一颗二叉树
  62. {
  63.         if(!T)
  64.         {
  65.                 *S = NULL;
  66.         }
  67.         else
  68.         {
  69.                 (*S) = (BiTree)malloc(sizeof(BiTree));
  70.                 (*S)->data = T->data;
  71.                 copyTree(T->lchild,&(*S)->lchild);
  72.                 copyTree(T->rchild,&(*S)->rchild);
  73.         }
  74. }

  75. void visit(char c)
  76. {
  77.         printf("%c", c);
  78. }

  79. void PreOrderTraverse(BiTree T,int level)
  80. {
  81.         if( T )
  82.         {
  83.                 visit(T->data);
  84.                 PreOrderTraverse(T->lchild,level+1);
  85.                 PreOrderTraverse(T->rchild,level+1);
  86.         }
  87. }

  88. int main()
  89. {
  90.         int level = 1;
  91.         BiTree T = NULL;
  92.         BiTree S;
  93.         int  i,j,s,f;

  94.         printf("中序序列为:\n");
  95.         for(i = 0;i<N;i++)
  96.         {
  97.                 printf("%c",pmid[i]);// 不得不服啊,[i]这个能漏?
  98.         }
  99.         printf("\n");

  100.         printf("后序序列为:\n");
  101.         for(j = 0;j<N;j++)
  102.         {
  103.                 printf("%c",post[j]);
  104.         }
  105.         printf("\n");
  106.         system("pause");
  107.        
  108.         s = strlen(pmid);
  109.         f = strlen(post);
  110.         CreatBiTree_pmid_post(&T,0,N-1,s);
  111.         printf("创建后前序遍历为:\n");
  112.         PreOrderTraverse(T,level);
  113.         printf("\n");
  114.         system("pause");

  115.         exchange(T);
  116.         printf("交换后前序遍历为:\n");
  117.         PreOrderTraverse(T,level);
  118.         printf("\n");
  119.        
  120.         copyTree(T,&S);
  121.         printf("复制后:\n");
  122.         PreOrderTraverse(T,level);
  123.         printf("\n");
  124.        
  125.         return 0;
  126. }
复制代码
我觉得是算法问题,表示自己修改。。。你可以先运行一次看看{:1_1:}
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-29 14:48:44 | 显示全部楼层
ElemType pmid[N+1] = {'G','D','J','H','K','B','E','A','C','F','M','I'}; //中序序列

C语言字符串借宿的标志是 '\0' ,所以总共有13个字符。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-29 15:58:24 | 显示全部楼层

没用的,你看我调试的那个窗口,post[N]的长度是f = 12  而pmid[N]的长度是s = 24, 不知道你发现没有  pmid的前12个是全局定义的pmid,而它后面的12个是post的全部元素。  我不懂为什么他们会合在一起了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-29 16:40:37 | 显示全部楼层

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #define N 13 // 结束符

  5. typedef char ElemType;

  6. ElemType pmid[N] = {'G','D','J','H','K','B','E','A','C','F','M','I'}; //中序序列

  7. ElemType post[N] = {'G','J','K','H','D','E','B','M','I','F','G','A'}; //后序序列

  8. typedef struct BiTNode
  9. {
  10.         char data;
  11.         struct BiTNode *lchild, *rchild;
  12. } BiTNode, *BiTree;

  13. int FindPos(char x,char pmid[]) //从start处开始查找
  14. {
  15.         int i;
  16.         for(i = N;i >= 0;i--)
  17.         {
  18.                 if(x == pmid[i]) // 不得不服啊,[i]这个能漏?
  19.                 {  
  20.                         return i; //返回中序根节点位置
  21.                 }
  22.                
  23.         }
  24.        
  25.         return 0;
  26. }


  27. // 这里就有问题了。。。
  28. void CreatBiTree_pmid_post(BiTree *T,int i,int j,int len) //i为mid[]中的首字符下标,j为post[]中的尾字符下标,len为子树字符串长度
  29. {
  30.         int m;
  31.         int leftlen,rightlen;
  32.         if(len <= 0)
  33.         {
  34.                 (*T) = NULL;
  35.         }
  36.         else
  37.         {
  38.                 (*T) = (BiTree)malloc(sizeof(BiTree));
  39.                 (*T)->data = post[j];

  40.                 m = FindPos(post[j],pmid);// 小于m的是左孩子,大于m的是右孩子
  41.                 printf("根节点位于第%d个字符,元素为%c\n",m+1,pmid[m]);

  42.                 leftlen = m - i; //以m为根,左孩子的长度
  43.                 rightlen = len - leftlen -1;//以m为根,右孩子的长度
  44.                
  45.                 CreatBiTree_pmid_post(&(*T)->lchild,i,j-1-rightlen,leftlen);
  46.                 CreatBiTree_pmid_post(&(*T)->rchild,m+1,j-1,rightlen);
  47.         }
  48. }

  49. void exchange(BiTree T)
  50. {
  51.         BiTree p;
  52.         if(T)
  53.         {
  54.                 p = T->lchild;
  55.                 T->lchild = T->rchild;
  56.                 T->rchild = p;
  57.                 exchange(T->lchild);
  58.                 exchange(T->rchild);
  59.         }
  60. }


  61. void copyTree(BiTree T,BiTree *S) //递归复制一颗二叉树
  62. {
  63.         if(!T)
  64.         {
  65.                 *S = NULL;
  66.         }
  67.         else
  68.         {
  69.                 (*S) = (BiTree)malloc(sizeof(BiTree));
  70.                 (*S)->data = T->data;
  71.                 copyTree(T->lchild,&(*S)->lchild);
  72.                 copyTree(T->rchild,&(*S)->rchild);
  73.         }
  74. }

  75. void visit(char c)
  76. {
  77.         printf("%c", c);
  78. }

  79. void PreOrderTraverse(BiTree T,int level)
  80. {
  81.         if( T )
  82.         {
  83.                 visit(T->data);
  84.                 PreOrderTraverse(T->lchild,level+1);
  85.                 PreOrderTraverse(T->rchild,level+1);
  86.         }
  87. }

  88. int main()
  89. {
  90.         int level = 1;
  91.         BiTree T = NULL;
  92.         BiTree S;
  93.         int  i,j,s,f;

  94.         printf("中序序列为:\n");
  95.         for(i = 0;i<N;i++)
  96.         {
  97.                 printf("%c",pmid[i]);// 不得不服啊,[i]这个能漏?
  98.         }
  99.         printf("\n");

  100.         printf("后序序列为:\n");
  101.         for(j = 0;j<N;j++)
  102.         {
  103.                 printf("%c",post[j]);
  104.         }
  105.         printf("\n");
  106.         system("pause");
  107.        
  108.         s = strlen(pmid);
  109.         f = strlen(post);
  110.         CreatBiTree_pmid_post(&T,0,N-1,s);
  111.         printf("创建后前序遍历为:\n");
  112.         PreOrderTraverse(T,level);
  113.         printf("\n");
  114.         system("pause");

  115.         exchange(T);
  116.         printf("交换后前序遍历为:\n");
  117.         PreOrderTraverse(T,level);
  118.         printf("\n");
  119.        
  120.         copyTree(T,&S);
  121.         printf("复制后:\n");
  122.         PreOrderTraverse(T,level);
  123.         printf("\n");
  124.        
  125.         return 0;
  126. }
复制代码
我觉得是算法问题,表示自己修改。。。你可以先运行一次看看
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-29 16:50:21 | 显示全部楼层
a372187663 发表于 2014-4-29 15:58
没用的,你看我调试的那个窗口,post[N]的长度是f = 12  而pmid[N]的长度是s = 24, 不知道你发现没有  pm ...


就是因为我说的原因啊,pmid这个字符串你没有给他终止符,他当然吧后面的字符串(post)也给显示出来了啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-29 16:52:15 | 显示全部楼层
HHR 发表于 2014-4-29 16:41
我觉得是算法问题,表示自己修改。。。你可以先运行一次看看

对的,楼主你写的那部分的算法有问题。两个递归里面的参数要改一下
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-29 16:56:13 | 显示全部楼层
24 行、114 行 忘记写上 [i]
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-29 17:32:10 | 显示全部楼层
HHR 发表于 2014-4-29 16:41
我觉得是算法问题,表示自己修改。。。你可以先运行一次看看

由中序序列和后序序列建立一颗二叉树,出了问题
http://bbs.fishc.com/thread-46428-1-1.html

你看我的这个回帖 我自己改出来了  元素只有11个  我的N也是11 也没错啊 能运行啊  为什么这个元素12个就不行了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-29 17:37:35 | 显示全部楼层
sidfate 发表于 2014-4-29 16:52
对的,楼主你写的那部分的算法有问题。两个递归里面的参数要改一下

由中序序列和后序序列建立一颗二叉树,出了问题
http://bbs.fishc.com/thread-46428-1-1.html
看我的回帖, 基本上一样 就是 中序序列和后序序列换成12个元素的了 那一篇里面元素是11个,我的N也是11 但是可以运行出来,换成12个元素的,N换成12就不行了。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-29 17:54:58 | 显示全部楼层
HHR 发表于 2014-4-29 16:41
我觉得是算法问题,表示自己修改。。。你可以先运行一次看看

ElemType post[N] = {'G','J','K','H','D','E','B','M','I','F','G','A'}; //后序序列

不好意思  是我的全局变量写错了,, 第一个跟倒数第二个写成一样的了= =。。。 是我打的草稿字写的太丑了  
:cry:cry:cry
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-4-29 17:55:51 | 显示全部楼层
sidfate 发表于 2014-4-29 16:52
对的,楼主你写的那部分的算法有问题。两个递归里面的参数要改一下

ElemType post[N] = {'G','J','K','H','D','E','B','M','I','F','G','A'}; //后序序列

不好意思  是我的全局变量写错了,, 第一个跟倒数第二个写成一样的了= =。。。 现在可以运行了。。。。
是我打的草稿字写的太丑了   把C写成了G。。。
:cry:cry:cry
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-29 18:31:40 | 显示全部楼层
嗯,问题解决就好,继续加油!
这些问题都要琢磨琢磨,练练总有好处。。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2014-4-30 08:54:50 | 显示全部楼层
恩恩!非常支持楼上的回答!:lol:
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 05:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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