题目描述
编写程序在二叉树中查找给定结点及父结点。二叉树结点的数据域值不等于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;
}