树与二叉树操作(二)

交换所有节点的左右子树

void swaptree(BiTree &T){
    BiTree temp;
    if(T){
        swaptree(T->lchild);
        swaptree(T->rchild);
        temp=T->lchild;
        T->lchild=T->rchild;
        T->rchild=temp;
    }
}

判断两个树是否相似(只有根节点或者是为空)

int similartree(BiTree &T1,BiTree &T2){
    int s1,s2;
    if(T1==NULL&&T2==NULL){
        return 1;
    }
    if(T1==NULL||T2==NULL){
        return 0;
    }
    s1=similartree(T1->lchild,T2->rchild);
    s2=similartree(T2->lchild,T2->rchild);
    return s1*s2;
}

将给定的表达式树转化为等价的中缀表达式

void BitreeToExp(BiTree &T,int depth){
    if(T==NULL) return;
    if(T->lchild==NULL&&T->rchild==NULL){
        cout<<T->data;//输出操作数
    }
    else{
        if(depth>1){cout<<'(';}
        BitreeToExp(T->lchild,depth+1);
        cout<<T->data;//输出操作符
        BitreeToExp(T->rchild,depth+1);
        if(depth>1){cout<<')';}//若有一层子表达式,则增加一成括号
    }
}
void BitreeToE(BiTree &T){
    BitreeToExp(T,1);
}

 删除元素x的子树

void DeleteTreeX(BiTree &T){
    if(T!=NULL){
        DeleteTreeX(T->lchild);
        DeleteTreeX(T->rchild);
        free(T);
    }
}
void Search(BiTree &T,ElemType e){
    Queue q;
    BiTree bit=T;
    q.front=-1;
    q.rear=-1;
    if(T->data==e){
        DeleteTreeX(T);
        exit(0);
    }
    q.b[++q.rear]=bit;
    while(q.front!=q.rear){
        bit=q.b[++q.front];
        if(bit->lchild){
            if(bit->lchild->data==e){
            DeleteTreeX(bit->lchild);
            bit->lchild=NULL;
            }
            else{q.b[++q.rear]=bit->lchild;
            }
        }
        if(bit->rchild){
            if(bit->rchild->data==e){
            DeleteTreeX(bit->rchild);
            bit->rchild=NULL;
            }
            else{q.b[++q.rear]=bit->rchild;}
        }
    }
}

 

posted on 2019-10-06 21:15  一仟零一夜丶  阅读(234)  评论(0)    收藏  举报