#include
#include
#include
typedef int Elemtype;
typedef struct Bitnode
{Elemtype data;//数据域//
struct Bitnode *lchild,*rchild;//左右指针域//
}Bitnode,*Bitree;
//建立二叉树//
int CreatBitree(Bitree T )
{Elemtype ch,temp;
scanf("%d",&ch);
if(ch==-1)
T=NULL;
else
{
T=(Bitree)malloc(sizeof(Bitnode));
T->data=ch;
printf("输入%d的左子树:",ch);
CreatBitree(T->lchild);
printf("输入%d的右子树:",ch);
CreatBitree (T->rchild);}
return 1;
}
//先序遍历二叉树//
void preorder(Bitree T )
{if(T!=NULL) printf("%d ",T->data);
preorder(T->lchild );
preorder(T->rchild );
}
//交换二叉树左右节点//
int jiaohuan(Bitree &T)
{
Bitree k;
if(T==NULL) return 0;
else while(T->lchild!=NULL||T->rchild!=NULL)
{
k=T->lchild;
T->lchild=T->rchild;
T->rchild=k;
}jiaohuan(T->lchild);
jiaohuan(T->rchild);
printf("hjkd");
}
//输出二叉树//
int shuchu(Bitree T)
{if(T==NULL) return 0;
else printf("%d",T->data);
shuchu(T->lchild);
shuchu(T->rchild);
}
int main(void)
{
int num=0;
Bitree T=(Bitree)malloc(sizeof(Bitree));
printf("输入根节点色数,-1时为空姐点:");
CreatBitree(*T);
preorder(*T);
jiaohuan(*T);
shuchu(*T);
return 0;
}
推荐使用无返回值的void型
void exchange(Bitree *root)
{
Bitree *t=NULL;
if(root->lchild==NULL && root->rchild==NULL)
return;
else
{
t=root->lchild;
root->lchild=root->rchild;
root->rchild=t;
}
if(root->lchild)
exchange(root->lchild);
if(root->rchild)
exchange(root->rchild);
}
推荐使用无返回值的void型
主要问题还是没有判断每个节点是否存在左孩子和右孩子
int jiaohuan(Bitree &T)
{
Bitree k;
if(T==NULL) return 0;
else while(T->lchild!=NULL||T->rchild!=NULL)
{
k=T->lchild;
T->lchild=T->rchild;
T->rchild=k;
}
jiaohuan(T->lchild); 这里没有判断左孩子是否存在
jiaohuan(T->rchild); 没有判断右孩子是否存在
printf("hjkd");
}
Status ExChange(Bitree *T)
{ //构造函数,使用递归算法进行左右结点转换
Bitree temp;
if(T!=NULL)
{ //判断T是否为空,非空进行转换,否则不转换
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
ExChange(T->lchild);
ExChange(T->rchild);
}
return 0;
}
你上面的代码是c语言把!c语言怎么可以用引用能(&)?
下面是我写的C++代码,基本换汤不换药!!
//AB##CD#G##EF###
//中序遍历:BADGCFE
//交换左右子树后的中序遍历: EFCGDAB
#include
using namespace std;
typedef char TElemType;
typedef int Status;
typedef struct BiNode{
TElemType data;
struct BiNode *lchild,*rchild; //左右孩子指针
}BiTNode,*BiTree;
char ch ;
//AB##CD#G##EF###
//中序遍历:BADGCFE
//交换左右子树后的中序遍历: EFCGDAB
void CreateTree(BiTree &T)
{
if((ch = getchar())!=EOF){
if(ch=='#') T=NULL;
else
{
T= new BiTNode;
T->data= ch;
CreateTree(T->lchild);
CreateTree(T->rchild);
}
}
}
void PreOrderTraverse(BiTree &T)
{
if(T==NULL) return; //空二叉树
else
{
PreOrderTraverse(T->lchild); //递归遍历左子树
cout<data; //访问根结点
PreOrderTraverse(T->rchild); //递归遍历右子树
}
}
Status ExChange(BiTree &T)
{ //构造函数,使用递归算法进行左右结点转换
BiTree temp;
if(T!=NULL)
{ //判断T是否为空,非空进行转换,否则不转换
temp=T->lchild;
T->lchild=T->rchild;
T->rchild=temp;
ExChange(T->lchild);
ExChange(T->rchild);
}
return 0;
}
void Display(BiTree &T)
{
PreOrderTraverse(T);
}
int main()
{
BiTree T;
CreateTree(T);
PreOrderTraverse(T);
cout<<endl;
ExChange(T);
Display(T);
}