二叉树查找结点及父结点

题目描述

编写程序在二叉树中查找给定结点及父结点。二叉树结点的数据域值不等于0的整数。

输入描述

输入第1行为一组用空格间隔的整数,表示带空指针信息的二叉树先根序列,其中空指针用0表示。例如1 5 8 0 0 0 6 0 0表示如下图的二叉树。第2行为整数m,表示查询个数。接下来m行,每行为一个不等于0的整数K,表示要查找的结点的数据值。m不超过100,二叉树结点个数不超过150000,高度不超过6000。输入数据保证二叉树各结点数据值互不相等。

 

输出描述

输出为m行,每行1个整数,表示被查找结点K的父结点数据值,若二叉树中无结点K或结点K无父结点,则输出0。

输入样例

1 5 8 0 0 0 6 0 0

3

8

1

6

输出样例

5

0

1

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

typedef int ElementType;
typedef struct BiTNode{
    ElementType data;
    struct BiTNode *lchild;
    struct BiTNode *rchild;
}BiTNode,*BiTree;
//定义树结点
BiTree creat()
{
    int ch;
    BiTree T;
    scanf("%d",&ch);
    if(ch == 0)
    {
        return NULL;
    }
    else
    {
        T = (BiTNode*)malloc(sizeof(BiTNode))
        T->data = ch;
        T->lchild = creat();
        T->rchild = creat();
    }
    return T;
}
//先根序列创树

BiTree DFS(int x,BiTree T)
{
    if(T == NULL)//判断是否为空树
        return NULL;
    if((T->lchild != NULL && T->lchild->data == x) || (T->rchild != NULL && T->rchild->data == x))//要优先判断子树是否为空,不然会内存溢出
        return T;
    BiTree result = DFS(x,T->lchild);//先查左子树,再查右子树
    if(result!=NULL)
        return result;
    return DFS(x,T->rchild);
}//递归查找

int main()
{
    BiTree A = creat();
    //建树
    int i;
    int a[100];//定义一个数组用来存储需要查找的数
    BiTree b;

    scanf("%d",&i);
    for(int k=0;k<i;k++)
        scanf("%d",&a[k]);//接收要查找的数据

    for(int k=0;k<i;k++) {
        b = DFS(a[k], A);//返回父节点的指针
        if(b!=NULL)
        printf("%d", b->data);
        else{
            printf("0");//如果没找到就打印0
        }
        if(k<i)
            putchar(10);//打印一个换行符
    }
    return 0;
}

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值