首页 > 其他分享 >144-11

144-11

时间:2023-10-11 22:12:08浏览次数:36  
标签:11 lchild 144 return Tree rchild data Delete

给定二叉树,删除结点值为x的左右子树

利用层次遍历找到结点值为x的左右子树,分别删除;

删除算法

void Delete(Tree &T)
{
    if(T)
    {
        Delete(T->lchild);
        Delete(T->rchild);
        free(T);
    }
}

完整算法

#include <stdio.h>
#include <stdlib.h>

#define MaxSize 100

typedef struct node{
    int data;
    struct node *lchild,*rchild;
}TreeNode,*Tree;

typedef TreeNode* Elem;

typedef struct{
    Elem data[MaxSize];
    int front;
    int rear;
}Queue;

void InitQueue(Queue &Q)
{
    Q.front=Q.rear=0;
}

bool isEmpty(Queue Q)
{
    if(Q.front==Q.rear)
        return true;
    else
        return false;
}

bool isFull(Queue Q)
{
    if((Q.rear+1)%MaxSize==Q.front)
        return true;
    else
        return false;
}

bool EnQueue(Queue &Q,Elem p)
{
    if(isFull(Q))
        return false;
    Q.data[Q.rear]=p;
    Q.rear=(Q.rear+1)%MaxSize;
    return true;
}

bool DeQueue(Queue &Q,Elem &p)
{
    if(isEmpty(Q))
        return false;
    p=Q.data[Q.front];
    Q.front=(Q.front+1)%MaxSize;
    return true;
}

void CreateTree(Tree &T)
{
    int x;
    scanf("%d",&x);
    if(x==-1)
    {
        T=NULL;
        return;    
    }
    else
    {
        T=(TreeNode*)malloc(sizeof(TreeNode));
        T->data=x;
        printf("输入%d的左结点:",x);
        CreateTree(T->lchild);
        printf("输入%d的右结点:",x);
        CreateTree(T->rchild);
    }
}

void Delete(Tree &T)
{
    if(T)
    {
        Delete(T->lchild);
        Delete(T->rchild);
        free(T);
    }
}

void Select(Tree &T,int x)
{
    if(T->data==x)
    {
        Delete(T);
        return;
    }
    TreeNode *p=T;
    Queue Q;
    InitQueue(Q);
    EnQueue(Q,p);
    while(!isEmpty(Q))
    {
        DeQueue(Q,p);
        if(p->lchild)
        {
            if(p->lchild->data==x)
            {
                Delete(p->lchild);
                p->lchild=NULL;
            }
        }
        if(p->rchild)
        {
            if(p->rchild->data==x)
            {
                Delete(p->rchild);
                p->rchild=NULL;
            }
        }
    }
}

void PreOrder(Tree T)
{
    if(T==NULL)
        return;
    else
    {
        printf("%d  ",T->data);
        PreOrder(T->lchild);
        PreOrder(T->rchild);    
    }
    
}

int main()
{
    Tree T;
    CreateTree(T);
    PreOrder(T);
    printf("\n");
    Select(T,2);
    PreOrder(T);
    return 0;
}

 

标签:11,lchild,144,return,Tree,rchild,data,Delete
From: https://www.cnblogs.com/simpleset/p/17758337.html

相关文章

  • 144-10 感觉有点难
    二叉树使用二叉链表存储,求先序序列中第k个结点的值首先明确先序遍历是根-左-右,使用递归算法,先左子树,后右子树。为了防止在找到第k个结点之前就进入右子树的遍历,可以在递归调用时,将左子树的返回值存储在一个变量中,并进行判断。如果左子树的返回值不等于特定的值(例如-1),则表示已经......
  • 2023.10.11 一些好题
    A你有\(m\)个相同的球,球有性能\(c\),你可以测试\(x\),若\(x\gec\),那么球会碎掉,若\(x<c\),那么球不碎。性能的范围\(n\le1e5\)。求最多要测试多少次。首先答案有一个上限是\(\logn\)。所以令\(m\to\min(m,\logn)\)所以我们记状态可以记\(dp_{l,r,k}\)表示当前确......
  • 大二打卡(10.11)
    今天做了什么:英语课,今天对于老师上课的小发问都能回答上来,不知道是不是因为坐的稍微靠后心情没那么紧张,脑子活了,听力最后一部分听的不行,比上回好了一点,但有限弄了半天建民的测试,我现在已经不知道自己搞错哪一步了,tomcat重装,connector也下了重装,web项目建立的也没问题,代码也没保......
  • 144-9
    链式存储的二叉树,交换左右结点位置递归#include<stdio.h>#include<stdlib.h>#defineMaxSize100typedefstructnode{intdata;structnode*lchild,*rchild;}TreeNode,*Tree;voidCreateTree(Tree&T){intx;scanf("%d",&x)......
  • 2023.10.11——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.java的一些特性;明日计划:学习......
  • 10.11(动物园管理员)
    第一版:把每种动物都定义为一个类,漏洞大,每天加一种动物或者动物数量发生变化都会需要对代码进行调整每种动物的喂食函数名也不同packagehomework;publicclasstext{publicstaticvoidmain(Stringargs[]){Feederf=newFeeder("小王");......
  • 2023/10/11 网络的学习
    学习笔记1网络基础1.1 什么是网络网络:计算机网络,电脑和电脑之间通过线缆或其他介质连接起来,并实现相互之间的通信。通信:人与人,人与物,物与物之间通过某种媒介和行为进行沟通。1.2 网络的分类局域网:作用于相对较小区域。例如企业内部网络,校园内部网络等。城域网:作用于城......
  • 231011校内赛
    T1树上的数题解比上一次好一些的第一题不过我还是没做出来一眼树形\(dp\)不过状态设计和转移不是很好列容易想到对于子树枚举,记录\(f_{i,j}\)表示\(i\)的子树空出了\(j\)个点时的方案数对于每一个节点的初始状态都是\(f_{i,0}=n-dep_i\\\f_{i,1}=1\)为......
  • 20231011
    20231011NOIP#18总结时间安排7:50~8:30看题,\(A,C\)一眼切,\(B\)不会一点,\(D\)应该能爆搜不知道拿多少分。8:30~8:40写\(A\)的正解。8:40~9:40写\(C\)的正解。9:40~10:20写\(D\)的爆搜再加点剪枝,打点数据特判希望骗分。10:20~11:50写了\(B\)的爆搜,然后打特殊......
  • oracle11g linux环境安装
    【0】需求在centos7上安装oracle11G1204,有7个文件。【1】环境配置(1.1)修改主机名【1】hostnamenew_hostname#直接修改本地主机名 hostnamectlset-hostnamenew_hostname  【2】vi /etc/sysconfig/network#修改网......