考研数据结构(每日一题)day32

考研数据结构(每日一题)

题目:已知二叉树以二叉链表存储,编写算法完成:对于树中每个元素值为x的结点,删去以它为根的子树,并释放相应的空间。

算法思想:

  1. 采用递归
  2. 后序遍历。删除值为x的结点,将其父节点的左(右)子树指针置空,用层次遍历找到某结点的父节点

完整代码:

//递归
void Del_all(BiTree &T,char x){
    if(T == NULL){
        return;
    }
    if(T -> data == x){
        Del_x(T);
        T = NULL;
        return;
    }
    Del_all(T -> lchild,x);
    Del_all(T -> rchild,x);
}
//在二叉树上查找所有以x为元素的结点,并删除以其为根的子树
void Search(BiTree bt,Elemtype x){
    BiTree Q[];     //Q是存放二叉树结点指针的队列,容量要足够大
    if(bt){
        if(bt -> data == x){  //若根结点值为x,则删除整棵树
            DeleteXTree(bt);
            exit(0);
        }
        InitQueue(Q);
        EnQueue(Q,bt);
        while(!IsEmpty(Q)){
            DeQueue(Q,p);
            if(p -> lchild){    //若左子女非空
                if(p -> lchild -> data == x){  //左子女符合删除左子树
                    DeleteXTree(p -> lchild);
                    p -> lchild = NULL;
                }else{   //父结点的左子女置空
                    EnQueue(Q,p -> lchild);   //左子树入队
                }
            }
            if(p -> rchild){  //若右子女非空
                if(p -> rchild -> data == x){  //右子女符合删除右子树
                    DeleteXTree(p -> rchild);
                    p -> rchild = NULL;
                }else{
                    EnQueue(Q,p -> rchild);  //右子树入队
                }
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值