#include <stdlib.h>
#include <stdio.h>
#include <string.h>
//二叉鏈表示法
typedef struct BiTNode
{
int data;
struct BiTNode *lchild,*rchild;
}BiTNode;
void inOrder(BiTNode *root)//中序遍歷(先遍歷左子樹然后遍歷根最后遍歷右子樹)
{
if(root==NULL)
{
return ;
}
inOrder(root->lchild);//遍歷左子樹
printf("%d ",root->data);//訪問根節點
inOrder(root->rchild);//遍歷右子樹
}
BiTNode* CopyTree(BiTNode* root)//拷貝樹
{
BiTNode* newNode=NULL;
BiTNode* newLp=NULL;
BiTNode* newRp=NULL;
if(root==NULL)
{
return NULL;
}
if(root->lchild!=NULL)
{
newLp=CopyTree(root->lchild);//拷貝左子樹
}
else
{
newLp=NULL;
}
if(root->rchild !=NULL)
{
newRp=CopyTree(root->rchild );//拷貝右子樹
}
else
{
newRp=NULL;
}
//malloc根節點
newNode=(BiTNode*)malloc(sizeof(BiTNode));
if(newNode==NULL)
{
return NULL;
}
newNode->lchild=newLp;
newNode->rchild=newRp;
newNode->data=root->data;
return newNode;
}
//釋放開辟的樹的結點
void FreeTree(BiTNode* root)
{
if(root==NULL)
{
return ;
}
if(root->lchild!=NULL)
{
FreeTree(root->lchild);
root->lchild=NULL;
}
if(root->rchild!=NULL)
{
FreeTree(root->rchild);
root->rchild=NULL;
}
if(root!=NULL)
{
free(root);
root=NULL;
}
}
int main()
{
int height=0;
BiTNode t1,t2,t3,t4,t5;
BiTNode *pt;
memset(&t1,0,sizeof(BiTNode));
memset(&t2,0,sizeof(BiTNode));
memset(&t3,0,sizeof(BiTNode));
memset(&t4,0,sizeof(BiTNode));
memset(&t5,0,sizeof(BiTNode));
t1.data=1;
t2.data=2;
t3.data=3;
t4.data=4;
t5.data=5;
//表達二叉樹,建立關系
t1.lchild=&t2;
t1.rchild=&t3;
t2.lchild=&t4;
t3.rchild=&t5;
printf("中序遍歷:");
inOrder(&t1);
printf("\n");
pt=CopyTree(&t1);
printf("調用函數CopyTree()之后:");
inOrder(pt);
printf("\n");
FreeTree(pt);
return 0;
}