eturn TRUE;
}
?
Status ReplaceLeft(BiTree &T,BiTree <){
if(NULL == T) return FALSE;
BiTree t;
t = T->lchild;
T->lchild = LT;
LT = t;
return TRUE;
}
?
Status ReplaceRight(BiTree &T,BiTree &RT){
if(NULL == T) return FALSE;
BiTree t;
t = T->rchild;
T->rchild = RT;
RT = t;
return TRUE;
}
Status CutLeft(BiTree &T,BiTree <){
if(NULL == T) {
LT = NULL;
return FALSE;
}
LT = T->lchild;
T->lchild = NULL;
return TRUE;
}
Status CutRight(BiTree &T,BiTree &RT){
if(NULL == T) {
RT = NULL;
return FALSE;
}
RT = T->lchild;
T->lchild = NULL;
return TRUE;
}
//先序遍历
Status PreTraverse(BiTree T,Status(*visit)(TElemType e)){
if(NULL == T) return OK;
if(ERROR == visit(T->data)) return ERROR;
if(ERROR == PreTraverse(T->lchild,visit))
return ERROR;
return PreTraverse(T->rchild,visit);
}
//中序遍历
Status MidTraverse(BiTree T,Status(*visit)(TElemType e)){
if(NULL == T) return OK;
if(ERROR == MidTraverse(T->lchild,visit))
return ERROR;
if(ERROR == visit(T->data))
return ERROR;
return MidTraverse(T->rchild,visit);
}
//后序遍历
void AfterTraverse(BiTree T){
if (T == NULL)
? ? return ;
? else
? ? {
? ? ? AfterTraverse (T->lchild);
? ? ? AfterTraverse (T->rchild);
? ? ? printf ("%d", T->data);
? ? }
}
Status visit(TElemType e) {
printf("%d",e);
}
//求深度
int BiTreeDepth(BiTree T){
int dL = 0,dR = 0;
if(NULL == T) return 0;
else{
dL = BiTreeDepth(T->lchild);
dR = BiTreeDepth(T->rchild);
return 1+(dL > dR ? dL : dR);
}
}
//建立二叉树
BiTree CreatBT ()
{
? BiTree t;
? int x;
? scanf ("%d", &x);
? if (x == 0)
? ? {
? ? ? t = NULL;
? ? }
? else
? ? {
? ? ? t = (BiTree) malloc (sizeof (BiTNode));
? ? ? t->data = x;
? ? ? printf ("\n请输入%d结点的左子结点:", t->data);
? ? ? t->lchild = CreatBT ();
? ? ? printf ("\n请输入%d结点的右子结点:", t->data);
? ? ? t->rchild = CreatBT ();
? ? }
? return t;
}
int main(){
BiTree T;
int i,k;
? ? InitBiTree(T);
? ? printf("正在为您建立二叉树,请以输入'0'表示值为空\n");
? ? printf ("请输入根结点:\n");
? ? //建立一颗二叉树
T = CreatBT ();
//对用户输入的树判空
i = BiTreeEmpty(T);
if(1 == i){
printf ("该树为空树\n");
}else{
? ? printf(" ----------先序遍历二叉树 ----------\n");
PreTraverse(T,visit);
printf("\n ----------中序遍历二叉树 ----------\n");
MidTraverse(T,visit);
printf("\n ----------后序遍历二叉树 ----------\n");
AfterTraverse(T);
printf("\n ----------二叉树的深度----------\n");
k = BiTreeDepth(T);
printf("%d",k);
BiTree T1,T2;
T1 = T;
printf("\n ----------为您剪掉左子树----------\n");
CutLeft(T1,T2);
printf("\n ----------剪掉左子树的先序遍历二叉树 ----------\n");
PreTraverse(T1,visit);
printf("\n ----------为您将左子树接回----------\n");
ReplaceLeft(T1,T2);
printf("\n ----------接回左子树的先序遍历二叉树 ----------\n");
PreTraverse(T1,visit);
printf("\n ----------为您拆散这课二叉树 ----------\n");
BreakBitree(T,T1,T2);
printf("\n ----------拆散后根节点的先序遍历二叉树 ----------\n");
PreTraverse(T,visit);
printf("\n ----------拆散后左子树的先序遍历二叉树 ----------\n");
PreTraverse(T1,visit);
printf("\n ----------拆散后右子树的先序遍历二叉树 ----------\n");
PreTraverse(T2,visit);
printf("\n ----------为您重新组装这课二叉树 ----------\n");
BiTree t = MakeBiTree(T->data,T1,T2);
printf("\n ----------组装后的先序遍历二叉树 ----------\n");
PreTraverse(t,visit);
DestoryBiTree(T);
}
while(1){//设置一个死循环,为了不让程序结束而关闭窗口
?
}
return 0;
}
测试数据:
预期子树为:
测试结果为: