|
发表于 2014-4-29 13:53:16
|
显示全部楼层
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define N 13 // 结束符
- 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]) // 不得不服啊,[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]);// 不得不服啊,[i]这个能漏?
- }
- printf("\n");
- printf("后序序列为:\n");
- for(j = 0;j<N;j++)
- {
- printf("%c",post[j]);
- }
- printf("\n");
- system("pause");
-
- s = strlen(pmid);
- f = strlen(post);
- CreatBiTree_pmid_post(&T,0,N-1,s);
- printf("创建后前序遍历为:\n");
- PreOrderTraverse(T,level);
- printf("\n");
- system("pause");
- exchange(T);
- printf("交换后前序遍历为:\n");
- PreOrderTraverse(T,level);
- printf("\n");
-
- copyTree(T,&S);
- printf("复制后:\n");
- PreOrderTraverse(T,level);
- printf("\n");
-
- return 0;
- }
复制代码 我觉得是算法问题,表示自己修改。。。你可以先运行一次看看{:1_1:} |
|