【数据结构】设二叉树T用二叉链表结构存储,元素值为整数且互不相同,对给定的2个整数,若2个都不是T的元素,输出-2;若一个不是T的元素,输出-1;若2个都是T的元素,输出两者所在的层数的间隔数。

该代码实现了一个算法,通过层序遍历二叉树并使用队列辅助,寻找两个给定数值a和b在二叉树中的层数,返回它们之间的层数差。如果只找到一个节点或者两个节点都没找到,会返回相应的标志值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.算法思想

使用层序遍历+队列实现该功能。每次都将队列的队头元素出队,将其左右孩子入队。同时判断出队元素是否等于要求的整数a,b。如果等于某个值,则将当前层数的值赋值给该元素所在层数。每次将该层的最后一个结点出队处理后将当前层数+1。最后判断a,b的层数是否修改过,然后返回相应结果。

2.定义结构体

typedef struct BiNode {
    int data;
    struct BiNode* lchild;
    struct BiNode* rchild;
} BiNode,*BiTree;

3.函数实现

每次队头元素出队前先判断a,b是否都已经找到了,如果找到了那就返回层数的差值,否则就出队,继续寻找。
如果遍历完了该二叉树,说明要么只找到一个,要么一个都没找到(如果都找到了就会直接返回结果),因此进行判断并返回结果。

int check(BiTree T, int a, int b) {
    BiNode *Q[MAXSIZE];
    BiNode *p;
    int front = -1, rear = -1;
    int level = 0,level1 = -1,level2 = -1,last = 0;
    if(!T) {
        printf("该二叉树为空!");
        return -2;
    }
    Q[++rear] = T;
    while(front < rear) {
        if(level1 != -1 && level2 != -1) {//都找到时,返回层数差值
        printf("数据:%d所在的层数为:%d\n数据:%d所在的层数为:%d\n",a,level1,b,level2);
        return level1 > level2 ? level1-level2 : level2-level1;
        } 
        p = Q[++front];//队头元素出队
        //左右孩子入队
        if(p->lchild) {
            Q[++rear] = p->lchild;
        }
        if(p->rchild) {
            Q[++rear] = p->rchild;
        }
        //比较当前结点是否为a或b结点
        if(p->data == a) {
            level1 = level+1;
        }
        if(p->data == b) {
            level2 = level+1;
        }
        if(last == front) {//遍历到该层最后一个结点
            level++;
            last = rear;
        }
    }
    //只找到一个元素
    if(level1 != -1 || level2 != -1) {
        return -1;
    }
    //两个都没找到
    return -2;
}

4.测试结果

在这里插入图片描述
在这里插入图片描述

5.完整代码

#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 50

typedef struct BiNode {
    int data;
    struct BiNode* lchild;
    struct BiNode* rchild;
} BiNode,*BiTree;

/*层序遍历+队列*/
int check(BiTree T, int a, int b) {
    BiNode *Q[MAXSIZE];
    BiNode *p;
    int front = -1, rear = -1;
    int level = 0,level1 = -1,level2 = -1,last = 0;
    if(!T) {
        printf("该二叉树为空!");
        return -2;
    }
    Q[++rear] = T;
    while(front < rear) {
        if(level1 != -1 && level2 != -1) {//都找到时,返回层数差值
        printf("数据:%d所在的层数为:%d\n数据:%d所在的层数为:%d\n",a,level1,b,level2);
        return level1 > level2 ? level1-level2 : level2-level1;
        } 
        p = Q[++front];//队头元素出队
        //左右孩子入队
        if(p->lchild) {
            Q[++rear] = p->lchild;
        }
        if(p->rchild) {
            Q[++rear] = p->rchild;
        }
        //比较当前结点是否为a或b结点
        if(p->data == a) {
            level1 = level+1;
        }
        if(p->data == b) {
            level2 = level+1;
        }
        if(last == front) {//遍历到该层最后一个结点
            level++;
            last = rear;
        }
    }
    //只找到一个元素
    if(level1 != -1 || level2 != -1) {
        return -1;
    }
    //两个都没找到
    return -2;
}

int main() {
    BiTree l1 = (BiTree)malloc(sizeof(BiNode));
    BiNode *l2 = (BiNode *)malloc(sizeof(BiNode));
    BiNode *l3 = (BiNode *)malloc(sizeof(BiNode));
    BiNode *l4 = (BiNode *)malloc(sizeof(BiNode));
    BiNode *l5 = (BiNode *)malloc(sizeof(BiNode));
    BiNode *l6 = (BiNode *)malloc(sizeof(BiNode));
    BiNode *l7 = (BiNode *)malloc(sizeof(BiNode));
    l1->data = 1;
    l2->data = 2;
    l3->data = 3;
    l4->data = 4;
    l5->data = 5;
    l6->data = 6;
    l7->data = 7;
    l1->lchild = l2;
    l1->rchild = l3;
    l2->lchild = l4;
    l2->rchild = l5;
    l3->lchild = l6;
    l3->rchild = l7;
    l4->lchild = NULL;
    l4->rchild = NULL;
    l5->lchild = NULL;
    l5->rchild = NULL;
    l6->lchild = NULL;
    l6->rchild = NULL;
    l7->lchild = NULL;
    l7->rchild = NULL;
    int a = 2, b = 3;
    int result= check(l1, a, b);
    printf("结果为:%d\n",result);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天进步一点丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值