对于树中每一个元素值为x的结点,删去以它为根的子树

/*
输入样例:
1
124###3##

2
124###3##

2
123##4##537##8###
*/
#include <bits/stdc++.h>
using namespace std;
typedef struct node {
    char data;
    struct node *lchild;
    struct node *rchild;
} *Bitree;
char ch;
Bitree root, pre;
Bitree CreateBitree() {
    cin >> ch;
    Bitree T;
    T = new node;
    if(ch == '#') T = NULL;
    //注意:二叉树的输入需要严格遵守以#结尾的规则,并且输入顺序按照前序遍历的方式
    else {
        T->data = ch;
        T->lchild = CreateBitree();
        T->rchild = CreateBitree();
    }
    return T;
}

void Remove(Bitree T) {//删除以T为根节点的树

    if(T) {
        Remove(T->lchild);
        Remove(T->rchild);
    }

    delete T;//delete删除的是T指向的空间,而不是T本身

}

void print(Bitree T) {//前序遍历打印
    if(T) {
        cout << T->data << " ";
        print(T->lchild);
        print(T->rchild);
    }
}

void Pre(Bitree T, char x, Bitree pre) {
    if(T) {
        if(T->data == x && T != root) { //如果删除的不是根节点
            if(pre->lchild == T) pre->lchild = NULL;//防止删除节点的父节点的指针悬空
            else if(pre->rchild == T) pre->rchild = NULL;
            Remove(T);
            return;

        }
        else if(T->data==x)Remove(T);
        Pre(T->lchild, x, T);
        Pre(T->rchild, x, T);
    }
}

char dele;
int main() {
    cin >> dele;//输入要删除的数值
    root = CreateBitree();//建树
    print(root);//前序遍历打印树
//    pre = NULL;
    Pre(root, dele, root);//进行删除操作,输入分别代表根节点,要删除的数值,当前节点的父节点
    printf("\n________\n\n");
    if(dele==root->data) printf("NULL\n");//如果当前删除的是根节点那么输出NULL
    else print(root);//如果不是根节点,就按照前序遍历输出这棵树
    return 0;
}

猜你喜欢

转载自blog.csdn.net/yiqzq/article/details/80271185