看看这棵二叉树:
给定根节点,怎样将这棵二叉树拷贝出一棵新的二叉树?
不多逼逼,看代码:
先看二叉树节点结构体和实现代码:
typedef struct BinaryTreeNode
{
char data; //数据
struct BinaryTreeNode *left; //左孩子
struct BinaryTreeNode *right; //右孩子
}Node;
//拷贝二叉树
Node * copyBinaryTree(Node *root)
{
if (NULL == root)
{
return NULL;
}
Node *leftNode = copyBinaryTree(root->left);
Node *rlghtNode = copyBinaryTree(root->right);
Node *newTree = (Node*)malloc(sizeof(Node));
if (NULL == newTree)
{
printf("空间分配失败\n");
return NULL;
}
newTree->left = leftNode; //拷贝左子树
newTree->right = rlghtNode; //拷贝右子树
newTree->data = root->data; //拷贝数据
return newTree; //返回新树
}
二叉树的节点空间是开辟在堆区的,所以应该手动释放。
看下释放的代码:
//释放二叉树
void freeTree(Node *root)
{
if (NULL == root)
{
return;
}
freeTree(root->left); //释放左子树
freeTree(root->right); //释放右子树
free(root); //释放根节点
root = NULL;
}
测试下代码是否正确:(完整代码)
#include<iostream>
using namespace std;
typedef struct BinaryTreeNode
{
char data; //数据
struct BinaryTreeNode *left; //左孩子
struct BinaryTreeNode *right; //右孩子
}Node;
//中序遍历二叉树
void inOrder(Node *root)
{
if (NULL == root)
{
return;
}
inOrder(root->left);
printf("%c ",root->data);
inOrder(root->right);
}
//拷贝二叉树
Node * copyBinaryTree(Node *root)
{
if (NULL == root)
{
return NULL;
}
Node *leftNode = copyBinaryTree(root->left);
Node *rlghtNode = copyBinaryTree(root->right);
Node *newTree = (Node*)malloc(sizeof(Node));
if (NULL == newTree)
{
printf("空间分配失败\n");
return NULL;
}
newTree->left = leftNode; //拷贝左子树
newTree->right = rlghtNode; //拷贝右子树
newTree->data = root->data; //拷贝数据
return newTree; //返回新树
}
//释放二叉树
void freeTree(Node *root)
{
if (NULL == root)
{
return;
}
freeTree(root->left); //释放左子树
freeTree(root->right); //释放右子树
free(root); //释放根节点
root = NULL;
}
int main()
{
//准备数据
Node nodeA = { 'A',NULL,NULL };
Node nodeB = { 'B',NULL,NULL };
Node nodeC = { 'C',NULL,NULL };
Node nodeD = { 'D',NULL,NULL };
Node nodeE = { 'E',NULL,NULL };
Node nodeF = { 'F',NULL,NULL };
Node nodeG = { 'G',NULL,NULL };
Node nodeH = { 'H',NULL,NULL };
Node nodeI = { 'I',NULL,NULL };
//建立关系
nodeA.left = &nodeB;
nodeA.right = &nodeC;
nodeB.left = &nodeD;
nodeB.right = &nodeE;
nodeC.left = &nodeF;
nodeC.right = &nodeG;
nodeF.left = &nodeH;
nodeF.right = &nodeI;
//调用函数
printf("中序遍历源二叉树结果为:\n");
inOrder(&nodeA);
printf("\n");
printf("中序遍历拷贝二叉树:");
Node *copyRoot = copyBinaryTree(&nodeA);
inOrder(copyRoot);
printf("\n");
freeTree(copyRoot);
system("pause");
return 0;
}
测试结果: