二叉树的拷贝和释放

/*
树的定义:
 由一个或多个(n >= 0)结点组成的有限集合T,有且仅有一个结点称为根(root),当 n>1时,其余的结点分为m(m > 0)个相互不相交的有限集合T1, T2, ..., Tm。每个集合本身又是棵树,被称作这个根的子树。
 树的结构特点:
 1.非线性结构,有一个直接前驱,但可能有多个直接后继(1:n)
 2.树的定义具有递归行,树中还有树。
 3.树可以为空,即结点个数为0.
 若干术语:
 根->即根结点
 叶子->即终端节点(没有后继)
 森林->指m棵不相交的树的集合
 有序树->结点各子树从左至右有序,不能互换(左为第一)
 无序树->结点各子树可互换位置。
 双亲->即上层的那个结点(直接前驱)parent
 孩子->即下层结点的子树(直接后继)child
 兄弟->同一双亲下的同层结点(孩子之间互称兄弟)sibling
 堂兄弟->即双亲位于同一层的结点(但并非同一双亲)cousin
 祖先->即从根到该结点所经分支的所有结点
 结点->即树的数据元素
 结点的度->结点挂接的子树数(有几个直接后继就是几度)。
 结点的层次->从根到该结点的层数(根结点算第一层)
 终端结点->即度为0 的结点, 即叶子
 分支结点->除树根以为的结点(也称为内部结点)
 树的度->所有结点度中的最大值(MAX(各结点的度))
 树的深度(或者高度)->指所有结点中最大的层数(Max(各结点的层次))
 深度是从根结点从上往下
 高度是从叶子从上往下
 三种表示树的方法:
 双亲表示法
 struct Node
 {
 int data;
 int parent;
 };
 左孩子右兄弟表示法:
 孩子表示法:
 struct ChildNode
 {
 int data;
 ChildNode*;
 };
*/
/*
二叉树的遍历:
遍历定义:
指按某条搜索路线遍访每个节点且不重复(又称周游)。
遍历用途:
它是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切运算的基础和核心。
遍历的方法:
牢记一种约定,对每个结点的查看都是"先左后右"。
限定先左后右,树的遍历有三种实现方案:
DLR LDR  LRD
都要遍历到底在说
前(根)序遍历 中(根)序遍历 后(根)序遍历
DLR->先序遍历,即先根在左在右
LDR->中序遍历,即先左在根在右
LRD->后序遍历,即先左在右在根

*/

# include <stdio.h>
# include <stdlib.h>
# include <string.h>


//二叉树结点
typedef struct BINARYNODE
{
	char ch;
	struct BINARYNODE* lchild;
	struct BINARYNODE* rchild;
}BinaryNode;


//遍历二叉树
void Recursion(BinaryNode* root)
{
	if(root == NULL)
	{
		return ;
	}
	printf("%c", root->ch);
	//遍历左子树
	Recursion(root->lchild);
	//遍历右子树
	Recursion(root->rchild);
}


//拷贝二叉树
BinaryNode* CopyBinaryTree(BinaryNode* root)
{
	if(root == NULL)
	{
		return NULL;
	}
	//拷贝左子树
	BinaryNode* lchild = CopyBinaryTree(root->lchild);
	//拷贝右子树
	BinaryNode* rchild = CopyBinaryTree(root->rchild);
	//创建结点
	BinaryNode* newnode = (BinaryNode*)malloc(sizeof(BinaryNode));
	newnode->ch = root->ch;
	newnode->lchild = lchild;
	newnode->rchild = rchild;
	return newnode;
}


//释放二叉树内存
void FreeSpaceBinaryTree(BinaryNode* root)
{


	if(root == NULL)
	{
		return ;
	}
	//释放左子树
	FreeSpaceBinaryTree(root->lchild);
	//释放右子树
	FreeSpaceBinaryTree(root->rchild);
	//释放当前结点
	free(root);
}


void CrestBinaryTree()
{
	//创建结点
	BinaryNode node1 = {'A', NULL, NULL};
	BinaryNode node2 = {'B', NULL, NULL};
	BinaryNode node3 = {'C', NULL, NULL};
	BinaryNode node4 = {'D', NULL, NULL};
	BinaryNode node5 = {'E', NULL, NULL};
	BinaryNode node6 = {'F', NULL, NULL};
	BinaryNode node7 = {'G', NULL, NULL};
	BinaryNode node8 = {'H', NULL, NULL};
	
	//建立结点关系
	node1.lchild = &node2;
	node1.rchild = &node6;
	node2.rchild = &node3;
	node3.lchild = &node4;
	node3.rchild = &node5;
	node6.rchild = &node7;
	node7.lchild = &node8;
	BinaryNode* root = CopyBinaryTree(&node1);
	Recursion(root);


	printf("\n");
	FreeSpaceBinaryTree(root);
	//Recursion(root);
	//printf("\n");


}






int main(int argc, char *argv[])
{
	CrestBinaryTree();       
	return 0;
}




猜你喜欢

转载自blog.csdn.net/i_o_fly/article/details/79990679