/** * 删除二叉树 * @param root [树的根地址] */ void DestroyBiTree(BiTreeNode *root) { if (root) { DestroyBiTree(root->left); DestroyBiTree(root->right); free(root); } }
void DestroyBiTree(BiTree &T) { if (T) { DestroyBiTree(T->lchild); DestroyBiTree(T->rchild); free(T); T = NULL; } }
/* 初始条件: 二叉树T存在。操作结果: 销毁二叉树T */ Status DestroyBiTree(BiTree *T) { if (*T) { if ((*T)->lchild) DestroyBiTree(&(*T)->lchild); if ((*T)->rchild) DestroyBiTree(&(*T)->rchild); free(*T); *T = NULL; } }
void DestroyBiTree(BiPTree *T) { /* 初始条件: 二叉树T存在。操作结果: 销毁二叉树T */ if(*T) /* 非空树 */ { if((*T)->lchild) /* 有左孩子 */ DestroyBiTree(&(*T)->lchild); /* 销毁左孩子子树 */ if((*T)->rchild) /* 有右孩子 */ DestroyBiTree(&(*T)->rchild); /* 销毁右孩子子树 */ free(*T); /* 释放根结点 */ *T=NULL; /* 空指针赋0 */ } }
/** * 删除二叉树指定节点 * @param T 二叉树 * @param p 指定节点 * @param leftOrRight 判断是左孩子还是右孩子 */ void DeleteChild(BiTree *T, BiTreeNode *p, int leftOrRight) { if (!T) exit(1); if (leftOrRight == 0) { DestroyBiTree(p->left); p->left = NULL; } else { DestroyBiTree(p->right); p->right = NULL; } }
void DestroyBiTree(BiTree &T) { // 初始条件: 二叉树T存在。操作结果: 销毁二叉树T if(T) // 非空树 { if(T->lchild) // 有左孩子 DestroyBiTree(T->lchild); // 销毁左孩子子树 if(T->rchild) // 有右孩子 DestroyBiTree(T->rchild); // 销毁右孩子子树 free(T); // 释放根结点 T=NULL; // 空指针赋0 } }
void DestroyBiTree(BiThrTree *T) { /* DestroyBiThrTree调用的递归函数,T指向根结点 */ if(*T) /* 非空树 */ { if((*T)->LTag==0) /* 有左孩子 */ DestroyBiTree(&(*T)->lchild); /* 销毁左孩子子树 */ if((*T)->RTag==0) /* 有右孩子 */ DestroyBiTree(&(*T)->rchild); /* 销毁右孩子子树 */ free(*T); /* 释放根结点 */ T=NULL; /* 空指针赋0 */ } }
/* 操作结果: 根据LR为0或1,删除T中p所指结点的左或右子树 */ Status DeleteChild(BiTree p, int LR) /* 形参T无用 */ { if (p) { if (LR == 0) { DestroyBiTree(&p->lchild); p->lchild = NULL;// not necessary } else { DestroyBiTree(&p->rchild); p->rchild = NULL; } return OK; } return ERROR; }
main() { BiTNode * n1 = MakeNode(10, NULL, NULL); BiTNode * n2 = MakeNode(20, NULL, NULL); BiTNode * n3 = MakeNode(30, n1, n2); BiTNode * n4 = MakeNode(40, NULL, NULL); BiTNode * n5 = MakeNode(50, NULL, NULL); BiTNode * n6 = MakeNode(60, n4, n5); BiTNode * n7 = MakeNode(70, NULL, NULL); BiTree tree = InitBiTree(n7); SetLChild(tree, n3); SetRChild(tree, n6); printf("树的深度为:%d \n", GetDepth(tree)); printTree(tree, GetDepth(tree)); printf("\n先序遍历如下:"); PreOrderTraverse(tree, print); printf("\n中序遍历如下:"); InOrderTraverse(tree, print); printf("\n后序遍历如下:"); PostOrderTraverse(tree, print); DeleteChild(tree, 1); printf("\n后序遍历如下:"); PostOrderTraverse(tree, print); DestroyBiTree(tree); if (IsEmpty(tree)) printf("\n二叉树为空,销毁完毕\n"); }
void DestroyBiThrTree(BiThrTree *Thrt) { /* 初始条件:线索二叉树Thrt存在。操作结果:销毁线索二叉树Thrt */ if(*Thrt) /* 头结点存在 */ { if((*Thrt)->lchild) /* 根结点存在 */ DestroyBiTree(&(*Thrt)->lchild); /* 递归销毁头结点lchild所指二叉树 */ free(*Thrt); /* 释放头结点 */ *Thrt=NULL; /* 线索二叉树Thrt指针赋0 */ } }
//SqBiTree的测试程序 int main(int argc,char *argv[]) { int i=0; char buf[1024]; char e,newe; char *temp; bool k; position p; BiTree T,C; BiTree q,q2; InitBiTree(T); InitBiTree(C); printf("输入数据创建二叉树(#表示空):"); scanf("%s%*c",buf); temp=buf; CreateBiTree(T,temp,i); printf("\n遍历(前、中、后、层):"); PreOrderTraverse(T,Visit); printf("\n"); InOrderTraverse(T,Visit); printf("\n"); PostOrderTraverse(T,Visit); printf("\n"); LevelOrderTraverse(T,Visit); printf("\n二叉树是否为空:%s",BiTreeEmpty(T)==1?"空":"非空"); printf("\n树的深度:%d",BiTreeDepth(T)); printf("\n根节点的左孩子、双亲、左右孩子、左右兄弟节点"); q=LeftChild(T,*T); printf("\n%c %c %c %c %c %c",q==NULL?Nil:q->e,(q2=Parent(T,*q))==NULL?Nil:q2->e,(q2=LeftChild(T,*q))==NULL?Nil:q2->e, (q2=RightChild(T,*q))==NULL?Nil:q2->e,(q2=LeftSibling(T,*q))==NULL?Nil:q2->e, (q2=RightSibling(T,*q))==NULL?Nil:q2->e); printf("\n节点的新值:"); scanf("%c%*c",&newe); Assign(T,*q,newe); printf("\n替换后遍历(前、中、后、层):"); PreOrderTraverse(T,Visit); printf("\n"); InOrderTraverse(T,Visit); printf("\n"); PostOrderTraverse(T,Visit); printf("\n"); LevelOrderTraverse(T,Visit); printf("\n输入数据创建二叉树(#表示空):"); scanf("%s%*c",buf); temp=buf; i=0; CreateBiTree(C,temp,i); printf("\n输入要插入数据的层、序号和左右子树(0左1右):"); scanf("%d%d%d%*c",&p.level,&p.order,&k); InsertChild(T,p,k,C); printf("\n遍历(前、中、后、层):"); PreOrderTraverse(T,Visit); printf("\n"); InOrderTraverse(T,Visit); printf("\n"); PostOrderTraverse(T,Visit); printf("\n"); LevelOrderTraverse(T,Visit); printf("\n删除%d层%d个节点的右子树后遍历:",p.level,p.order); DeleteChild(T,p,1); printf("\n遍历(前、中、后、层):"); PreOrderTraverse(T,Visit); printf("\n"); InOrderTraverse(T,Visit); printf("\n"); PostOrderTraverse(T,Visit); printf("\n"); LevelOrderTraverse(T,Visit); DestroyBiTree(T); system("pause"); return 0; }
void main() { int i; BiPTree T,c,q; TElemType e1,e2; InitBiTree(&T); printf("构造空二叉树后,树空否?%d(1:是 0:否)树的深度=%d\n",BiTreeEmpty(T),BiTreeDepth(T)); e1=Root(T); if(e1!=Nil) printf("二叉树的根为: "form"\n",e1); else printf("树空,无根\n"); #ifdef CHAR printf("请按先序输入二叉树(如:ab三个空格表示a为根结点,b为左子树的二叉树)\n"); #endif #ifdef INT printf("请按先序输入二叉树(如:1 2 0 0 0表示1为根结点,2为左子树的二叉树)\n"); #endif CreateBiTree(&T); printf("建立二叉树后,树空否?%d(1:是 0:否) 树的深度=%d\n",BiTreeEmpty(T),BiTreeDepth(T)); e1=Root(T); if(e1!=Nil) printf("二叉树的根为: "form"\n",e1); else printf("树空,无根\n"); printf("中序递归遍历二叉树:\n"); InOrderTraverse(T,visitT); printf("\n后序递归遍历二叉树:\n"); PostOrderTraverse(T,visitT); printf("\n层序遍历二叉树:\n"); LevelOrderTraverse(T,visitT); printf("\n请输入一个结点的值: "); scanf("%*c"form,&e1); c=Point(T,e1); /* c为e1的指针 */ printf("结点的值为"form"\n",Value(c)); printf("欲改变此结点的值,请输入新值: "); scanf("%*c"form"%*c",&e2); Assign(c,e2); printf("层序遍历二叉树:\n"); LevelOrderTraverse(T,visitT); e1=Parent(T,e2); if(e1!=Nil) printf("\n"form"的双亲是"form"\n",e2,e1); else printf(form"没有双亲\n",e2); e1=LeftChild(T,e2); if(e1!=Nil) printf(form"的左孩子是"form"\n",e2,e1); else printf(form"没有左孩子\n",e2); e1=RightChild(T,e2); if(e1!=Nil) printf(form"的右孩子是"form"\n",e2,e1); else printf(form"没有右孩子\n",e2); e1=LeftSibling(T,e2); if(e1!=Nil) printf(form"的左兄弟是"form"\n",e2,e1); else printf(form"没有左兄弟\n",e2); e1=RightSibling(T,e2); if(e1!=Nil) printf(form"的右兄弟是"form"\n",e2,e1); else printf(form"没有右兄弟\n",e2); InitBiTree(&c); printf("构造一个右子树为空的二叉树c:\n"); #ifdef CHAR printf("请先序输入二叉树(如:ab三个空格表示a为根结点,b为左子树的二叉树)\n"); #endif #ifdef INT printf("请先序输入二叉树(如:1 2 0 0 0表示1为根结点,2为左子树的二叉树)\n"); #endif CreateBiTree(&c); printf("先序递归遍历二叉树c:\n"); PreOrderTraverse(c,visitT); printf("\n树c插到树T中,请输入树T中树c的双亲结点 c为左(0)或右(1)子树: "); scanf("%*c"form"%d",&e1,&i); q=Point(T,e1); InsertChild(q,i,c); printf("先序递归遍历二叉树:\n"); PreOrderTraverse(T,visitT); printf("\n删除子树,请输入待删除子树的双亲结点 左(0)或右(1)子树: "); scanf("%*c"form"%d",&e1,&i); q=Point(T,e1); DeleteChild(q,i); printf("先序递归遍历二叉树:\n"); PreOrderTraverse(T,visitT); printf("\n"); DestroyBiTree(&T); }