题目:把一棵二叉树复制到另一棵二叉树
=》 ![](https://img-blog.csdn.net/20140825170417897?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvU2hpbGlhbmcz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)
// * 二叉树的复制 */
// * ======================================== */
#include "stdio.h"
#include "stdlib.h"
struct tree
{
int data; // * 节点数据 */
struct tree *left; // * 指向左子树的指针 */
struct tree *right; // * 指向右子树的指针 */
};
typedef struct tree treenode;
typedef treenode *btree;
// * ---------------------------------------- */
// * 建立二叉树 */
// * ---------------------------------------- */
btree createbtree(int *data,int pos) //data为赋值给二叉树的各个节点的值,pos为data数组中的位置
{
btree newnode;
if ( data[pos] == 0 || pos > 15 )
return NULL;
else
{
newnode = ( btree ) malloc(sizeof(treenode));
newnode->data = data[pos];
newnode->left = createbtree(data,2*pos);
newnode->right = createbtree(data,2*pos+1);
return newnode;
}
}
// * ---------------------------------------- */
// * 二叉树复制 */
// * ---------------------------------------- */
btree copybtree(btree root)
{
btree newnode;
if ( root == NULL )
return NULL;
else
{
newnode = ( btree ) malloc(sizeof(treenode)); //申请新的二叉树的根节点的空间
newnode->data = root->data;
newnode->left = copybtree(root->left); //递归申请空间并把节点的左孩子的值分配给新二叉树对应的节点
newnode->right = copybtree(root->right); //分配右孩子的值<span style="white-space:pre">
return newnode; //返回新二叉树的根节点<span style="white-space:pre">
}
}
// * ---------------------------------------- */
// * 二叉树中序列印 */
// * ---------------------------------------- */
void printbtree(btree ptr)
{
if ( ptr != NULL )
{
printbtree(ptr->left);
printf("[%2d]",ptr->data);
printbtree(ptr->right);
}
}
// * ---------------------------------------- */
// * 主程式: 建立二叉树后备份它. */
// * ---------------------------------------- */
void main()
{
btree root = NULL; // * 指向原二叉树的根节点的指针 */
btree backup = NULL; // * 复制二叉树的根节点的指针 */
// * 二叉树节点数据 */
int data[16] = { 0, 5, 4, 6, 2, 0, 0, 8, 1,
3, 0, 0, 0, 0, 7, 9 };
root = createbtree(data,1); // * 建立树状结构 */
backup = copybtree(root); // * 复制二叉树 */
printf("原二叉树的节点内容 \n");
printbtree(root); // * 中序列二叉树 */
printf("\n备份二叉树的节点内容 \n");
printbtree(backup); // * 中序列二叉树 */
printf("\n"); // * 换行 */
}