在vs2017可直接运行
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct BiNode
{
char ch;
struct BiNode *lchild; /* 左孩子 */
struct BiNode *rchild; /* 右孩子 */
}BNODE;
void recursion(BNODE *root)
{
if (NULL == root)
return;
//printf("%c ", root->ch); //先序遍历
/* 递归遍历左子树 */
recursion(root->lchild);
//printf("%c ", root->ch); //中序遍历
/* 递归遍历右子树 */
recursion(root->rchild);
printf("%c ", root->ch); //后序遍历
}
/* 递归拷贝二叉树 */
BNODE *copyBinode(BNODE *root)
{
if (root == NULL)
return NULL;
/* 先拷贝左子树 */
BNODE *newLchild = copyBinode(root->lchild);
/* 在拷贝右子树 */
BNODE *newRchild = copyBinode(root->rchild);
BNODE *newRoot = malloc(sizeof(BNODE));
newRoot->lchild = newLchild;
newRoot->rchild = newRchild;
newRoot->ch = root->ch;
return newRoot;
}
/* 递归释放拷贝的二叉树 */
void freeSpace(BNODE *root)
{
if (NULL == root)
return;
freeSpace((root)->lchild);
freeSpace((root)->rchild);
/* 释放其实是后序遍历*/
printf("%c被释放\n", root->ch);
free(root);
}
void test()
{
BNODE nodeA = { 'A', NULL, NULL };
BNODE nodeB = { 'B', NULL, NULL };
BNODE nodeC = { 'C', NULL, NULL };
BNODE nodeD = { 'D', NULL, NULL };
BNODE nodeE = { 'E', NULL, NULL };
BNODE nodeF = { 'F', NULL, NULL };
BNODE nodeG = { 'G', NULL, NULL };
BNODE nodeH = { 'H', NULL, NULL };
nodeA.lchild = &nodeB;
nodeA.rchild = &nodeF;
nodeB.rchild = &nodeC;
nodeC.lchild = &nodeD;
nodeC.rchild = &nodeE;
nodeF.rchild = &nodeG;
nodeG.lchild = &nodeH;
printf("后序遍历: ");
recursion(&nodeA);
printf("\n*****************************\n");
BNODE *newroot = copyBinode(&nodeA);
printf("后序遍历: ");
recursion(newroot);
printf("\n*****************************\n");
freeSpace(newroot);
newroot = NULL;
}
int main()
{
test();
system("pause");
return 0;
}