二叉树的建立与遍历

这次的作业是输入二叉树的前序和中序然后构建出该二叉树并输出其后序。在做作业的时候首先自己得搞清楚二叉树的一些概念

二叉树基本上有4种遍历方法,先、中、后根,逐层。当初我对这个很迷惑,搞这么多干什么?到了后面才明白,这是不同的应用需要的。例如,判断两个二叉树是否相等,只要子树根节点不同,那么就不等,显然这时要用先序遍历;而删除二叉树,必须先删除左右子树,然后才能删除根节点,这时就要用后序遍历。实际上,搞这么多遍历方法,根本原因是在内存中储存的树是非线性结构。对于用数组储存的二叉树,这些名目繁多的方法都是没有必要的。利用C++的封装和重载特性,这些遍历方法能很清晰的表达。

下面提供主要的代码(老师给的哈!语言为C)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define N 27
struct tree
{
char data;
struct tree *left;
struct tree *right;
};
typedef struct tree treenode;
typedef treenode *btree;
btree creat(char a)
{
btree p;
p=(btree)malloc(sizeof(treenode));
p->data=a;
p->left=NULL;
p->right=NULL;
return p;
}
void LRNandFREE(btree p)
{
if ( p != NULL )
{
LRNandFREE(p->left);
LRNandFREE(p->right);
printf(“%c”,p->data);
free(p);
}
}
int onleft(char a, char b, char *p)
{
while(*p)
{
if(*p==a)
return 1;
if(*p==b)
return 0;
p++;
}
printf(“Cannot found %c and %c in InorderTraversal!\n”,a,b);
system(“pause”);
exit(0);
}
btree search(char a, btree root)
{
btree p;
if(root==NULL)
return NULL;
if(root->data==a)
return root;
else
{
p=search(a,root->left);
if(p==NULL)
p=search(a,root->right);
return p;
}
}
btree prev(char a, char b, char *s, btree root)
{
btree p;
int i, j;
for(i=0;;i++)
if(a==s[i]) break;
for(j=i+1;;j++)
if(b==s[j]) break;
for(j–;j>i;j–)
if((p=search(s[j],root))!=NULL)
return p;
return NULL;
}
void main()
{
char a[N],b[N];
int i,j;
btree root=NULL, p, q, t;
printf(“Input PreorderTraversal:\n”); /*输入前序遍历*/
scanf(“%s”,a);
printf(“Input InorderTraversal:\n”); /*输入中序遍历*/
scanf(“%s”,b);
if(strlen(a)>=N || strlen(a)!=strlen(b))
{
printf(“Input ERROR!\n”);
system(“pause”);
exit(0);
}
if(a[0]!=’\0′)
{
root=creat(a[0]);
p=root;
for(i=1;a[i]!=’\0′;i++)
{
q=creat(a[i]);
if(onleft(a[i],a[i-1],b))
{p->left=q; p=q;}
else
if(onleft(a[i-1],a[i],b))
{
t=prev(a[i-1],a[i],b,root);
if(t==NULL)
{p->right=q; p=q;}
else
{t->right=q; p=q;}
}
else
{
printf(“The two travelsal you have entered is not legal!\n”);
system(“pause”);
exit(0);
}
}
}
printf(“PostorderTraversal:\n”);
LRNandFREE(root);
printf(“\n”);
system(“pause”);
}

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define N 27

struct tree

{

char data;

struct tree *left;

struct tree *right;

};

typedef struct tree treenode;

typedef treenode *btree;

btree creat(char a)

{

btree p;

p=(btree)malloc(sizeof(treenode));

p->data=a;

p->left=NULL;

p->right=NULL;

return p;

}

void LRNandFREE(btree p)

{

if ( p != NULL )

{

LRNandFREE(p->left);

LRNandFREE(p->right);

printf(“%c”,p->data);

free(p);

}

}

int onleft(char a, char b, char *p)

{

while(*p)

{

if(*p==a)

return 1;

if(*p==b)

return 0;

p++;

}

printf(“Cannot found %c and %c in InorderTraversal!\n”,a,b);

system(“pause”);

exit(0);

}

btree search(char a, btree root)

{

btree p;

if(root==NULL)

return NULL;

if(root->data==a)

return root;

else

{

p=search(a,root->left);

if(p==NULL)

p=search(a,root->right);

return p;

}

}

btree prev(char a, char b, char *s, btree root)

{

btree p;

int i, j;

for(i=0;;i++)

if(a==s[i]) break;

for(j=i+1;;j++)

if(b==s[j]) break;

for(j–;j>i;j–)

if((p=search(s[j],root))!=NULL)

return p;

return NULL;

}

void main()

{

char a[N],b[N];

int i,j;

btree root=NULL, p, q, t;

printf(“Input PreorderTraversal:\n”); /*输入前序遍历*/

scanf(“%s”,a);

printf(“Input InorderTraversal:\n”); /*输入中序遍历*/

scanf(“%s”,b);

if(strlen(a)>=N || strlen(a)!=strlen(b))

{

printf(“Input ERROR!\n”);

system(“pause”);

exit(0);

}

if(a[0]!=’\0′)

{

root=creat(a[0]);

p=root;

for(i=1;a[i]!=’\0′;i++)

{

q=creat(a[i]);

if(onleft(a[i],a[i-1],b))

{p->left=q; p=q;}

else

if(onleft(a[i-1],a[i],b))

{

t=prev(a[i-1],a[i],b,root);

if(t==NULL)

{p->right=q; p=q;}

else

{t->right=q; p=q;}

}

else

{

printf(“The two travelsal you have entered is not legal!\n”);

system(“pause”);

exit(0);

}

}

}

printf(“PostorderTraversal:\n”);

LRNandFREE(root);

printf(“\n”);

system(“pause”);

}

我是经过测试后分享上来的 如果有问题请大家多多交流  祝大家好运!O(∩_∩)O~

14 双脚印 杠杠的~ 我要评论
  1. 蓝冰 December 14, 2009 at 20:24 1L

    额……二叉树……

    Reply

  2. Roam December 14, 2009 at 20:46 2L

    @蓝冰

    你博客改微博了???

    Reply

  3. 蓝冰 December 14, 2009 at 20:51 3L

    @Roam
    没有啊,你去的是 7v,把前面的v去掉……

    Reply

  4. Roam December 14, 2009 at 20:55 4L

    @蓝冰

    好的 发现你也在学数据结构哦。。。。

    Reply

  5. 蓝冰 December 14, 2009 at 20:59 5L

    @Roam
    老师在讲,但是我没学……光上网了……

    Reply

  6. 随风 December 14, 2009 at 23:30 6L

    代码看起都头疼

    Reply

  7. 疾风 December 15, 2009 at 00:06 7L

    你这东西深奥啊~··

    Reply

  8. junjun December 16, 2009 at 10:49 8L

    好久不动这个,看起来头痛

    Reply

  9. wu_wu December 17, 2009 at 18:39 9L

    看不动了。。。在学校就不喜欢写代码,现在工作了却写。。啊哈哈。。

    PS:我域名地址换了,记得更新下哦

    Reply

  10. Roam December 17, 2009 at 19:01 10L

    @wu_wu

    工作可以让人奋进哦 CN换成COM了 已经更新

    Reply

  11. Roam December 17, 2009 at 19:07 11L

    @随风

    要不我带你去医院。。。嘿嘿。。

    Reply

  12. 荒野无灯 April 4, 2010 at 19:35 12L

    目前正在学C,收藏了。

    Reply

  13. 荒野无灯 May 26, 2010 at 20:04 13L

    还没有看到这里来,呵呵。这学期是没时间看了,下学期把那本数据结构看完。

    Reply

  14. Roam May 26, 2010 at 20:09 14L

    @荒野无灯
    目前在做一个搜索功能 所以刚才去谷歌搜索了下supesite的分页函数,结果找到了你的一篇关于DZ的分页 哈哈 缘分呀!!!

    Reply