二叉树的拷贝和释放(递归)

Posted on 2016-06-01 11:13  洪爵士  阅读(2301)  评论(0编辑  收藏  举报
#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;
}