7-52 二叉树查找结点及父结点 (5 分)
编写程序在二叉树中查找给定结点及父结点。二叉树结点的数据域值不等于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
结尾无空行
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
typedef struct TNode* Position;
typedef Position BinTree;
struct TNode {
int Data;
BinTree Left;
BinTree Right;
BinTree Father;
};
int flag;
int k=0;
int arr[15000];
void CreatBinTree(BinTree *BT) {//对指针的修改需用指针的指针
int val;
scanf("%d", &val);
if (val == 0)*BT = NULL;
else {
*BT = (BinTree)malloc(sizeof(TNode));
(*BT)->Father = NULL;
(*BT)->Data = val;
(*BT)->Left = (*BT)->Right = NULL;
CreatBinTree(&(*BT)->Left);
CreatBinTree(&(*BT)->Right);
}
}
void Create(BinTree BT) {//对数据的修改需用数据的指针
if (BT->Left != NULL) {
BT->Left->Father = BT;
Create(BT->Left);
}
if (BT->Right != NULL) {
BT->Right->Father = BT;
Create(BT->Right);
}
}
int PreorderTraversal(BinTree BT,int X) {
int p;
if (BT->Data == X) {
flag = 1;
if (BT->Father == NULL) {//最大的那棵树无父节点
arr[k] = 0;
k++;
}
else {
p =BT->Father->Data;
arr[k] = p;
k++;
}
return flag;
}
if (BT->Left != NULL && flag == 0)
PreorderTraversal(BT->Left, X);
if (BT->Right != NULL && flag == 0)
PreorderTraversal(BT->Right, X);
}
int main() {
int m, i, x;
BinTree BT;
BT = (BinTree)malloc(sizeof(TNode));
CreatBinTree(&BT);
Create(BT);
scanf("%d", &m);
if (m < 100) {
for (i = 0; i < m; i++) {
flag = 0;
scanf("%d", &x);
PreorderTraversal(BT,x);
if (flag == 0) {//没找到x的情况
arr[k] = 0;
k++;
}
}
}
for (i = 0; i < k; i++) {
printf("%d\n", arr[i]);
}
system("pause");
return 0;
}