C语言实现二叉树深度复制

0 下载量 128 浏览量 更新于2024-08-03 收藏 2KB TXT 举报
本篇文章主要介绍了如何在C语言中实现二叉树的复制。首先,我们定义了一个名为`struct TreeNode`的数据结构,它包含了整型数据`data`,以及指向左右子节点的指针`left`和`right`。文章首先提供了创建二叉树的函数`createNode`,该函数接受一个整数作为输入,动态分配内存并初始化一个新的节点,用于构建二叉搜索树。 接下来,`createTree`函数用于递归地构建二叉树,根据输入值与当前节点值的大小关系决定将其放置在左子树或右子树中。如果输入值小于当前节点值,将插入到左子树;反之,插入到右子树。 核心部分是`TreeCopy`函数,这是复制二叉树的关键代码。它通过递归遍历原树,每当遇到一个非空节点,就创建一个新的节点,并将新节点的`data`、`left`和`right`分别设置为原节点的对应属性。这样,整个过程保持了树的结构和节点值的一致性,实现了对原二叉树的完整复制。 为了展示复制后的树结构,文章还提供了一些辅助函数,如`preOrder`、`inOrder`和`postOrder`,它们分别用于前序遍历(根-左-右)、中序遍历(左-根-右)和后序遍历(左-右-根),这些遍历方法可以帮助验证复制的二叉树是否正确。 本文档详细讲解了在C语言中如何通过递归算法实现二叉树的复制,包括数据结构定义、树的构建和复制操作的实现,对于理解和实践二叉树操作具有很好的参考价值。
183 浏览量
二叉树源代码#include # include typedef struct Tnode{ int data; /*输入的数据*/ struct Tnode *lchild,*rchild; /*结点的左右指针,分别指向结点的左右孩子*/ }*node,BSTnode; searchBST(node t,int key,node f,node *p) /*查找函数*/ { if(!t) {*p=f;return (0);} /*查找不成功*/ else if(key==t->data) {*p=t;return (1);} /*查找成功*/ else if(keydata) searchBST(t->lchild,key,t,p); /*在左子树中继续查找*/ else searchBST(t->rchild,key,t,p); /*在右子树中继续查找*/ } insertBST(node *t,int key) /*插入函数*/ { node p=NULL,s=NULL; if(!searchBST(*t,key,NULL,&p)) /*查找不成功*/ { s=(node)malloc(sizeof(BSTnode)); s->data=key; s->lchild=s->rchild=NULL; if(!p) *t=s; /*被插结点*s为新的根结点*/ else if(keydata) p->lchild=s;/*被插结点*s为左孩子*/ else p->rchild=s; /*被插结点*s为右孩子*/ return (1); } else return (0);/*树中已有关键字相同的结点,不再插入*/ } inorderTraverse(node *t) /*中序遍历函数*/ { if(*t){ if(inorderTraverse(&(*t)->lchild)) /*中序遍历根的左子树*/ printf("%d ",(*t)->data); /*输出根结点*/ if(inorderTraverse(&(*t)->rchild)); /*中序遍历根的右子树*/ } return(1) ; } calculateASL(node *t,int *s,int *j,int i) /*计算平均查找长度*/ { if(*t){ i++; /*i记录当前结点的在当前树中的深度*/ *s=*s+i; /*s记录已遍历过的点的深度之和*/ if(calculateASL(&(*t)->lchild,s,j,i))/*计算左子树的ASL*/ { (*j)++; /*j记录树中结点的数目*/ if(calculateASL(&(*t)->rchild,s,j,i)) /*计算右子树的ASL*/ {i--; return(1);} } else return(1); } } node Delete(node t,int key) /*删除函数*/ { node p=t,q=NULL,s,f; while(p!=NULL) /*查找要删除的点*/ { if(p->data==key) break; q=p; if(p->data>key) p=p->lchild; else p=p->rchild; } if(p==NULL) return t; /*查找失败*/ if(p->lchild==NULL) /*p指向当前要删除的结点*/ { if(q==NULL) t=p->rchild; /*q指向要删结点的父母*/ else if(q->lchild==p) q->lchild=p->rchild; /*p为q的左孩子*/ else q->rchild=p->rchild;/*p为q的右孩子*/ free(p); } else{ /*p的左孩子不为空*/ f=p; s=p->lchild; while(s->rchild) /*左拐后向右走到底*/ { f=s; s=s->rchild; } if(f==p) f->lchild=s->lchild; /*重接f的左子树*/ else f->rchild=s->lchild; /*重接f的右子树*/ p->data=s->data; free (s); } return t; } int balanceBST(node t,int *i) /*判断是否为平衡二叉树的函数*/ { int dep1,dep2; if(!t) return(0); else { dep1=balanceBST(t->lchild,i); dep2=balanceBST(t->rchild,i); } if((dep1-dep2)>1||(dep1-dep2)dep2) return(dep1+1); else return(dep2+1); } void main() { node T=NULL; int num; int s=0,j=0,i=0; int ch=0; node p=NULL; printf("please input a list of numbers end with zero:"); do{ scanf("%d",&num); if(!num) printf("you have finished your input!\n"); else insertBST(&T,num); }while(num); printf("\n\n---the menu of the opperation---\n"); /*主程序菜单*/ printf("\n 0: exit" ); printf("\n 1: inorder travel the tree"); printf("\n 2: the average search length for the tree"); printf("\n 3: delete"); printf("\n 4: judge the balance"); while(ch==ch) { printf("\n choose the opperation to continue:"); scanf("%d",&ch); switch(ch){ case 0: exit(0); /*0--退出*/ case 1: printf(" The result of the inorder traverse is:\n "); inorderTraverse(&T); /*1--中序遍历*/ break; case 2: s=0;j=0;i=0; calculateASL(&T,&s,&j,i); /*2--计算平均查找长度*/ printf(" ASL=%d/%d",s,j); break; case 3: printf(" Please input the number you want to delete:"); scanf("%d",&num); /*3--删除某个结点*/ if(searchBST(T,num,NULL,&p)) { T=Delete(T,num); printf(" You have delete the number successfully!\n "); inorderTraverse(&T); } else printf("无%d ",num); break; case 4: i=0; balanceBST(T,&i); /*判断是否为平衡二插树*/ if(i==0) printf(" OK!The tree is a balanced tree!"); else printf(" NO!"); break; default: printf("Your input is wrong!please input again!\n"); break; /*输入无效字符*/ } } }