二叉樹的拷貝和釋放(遞歸)


#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;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM