7-6 二叉树查找结点及父结点 (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
#include<bits/stdc++.h>
using namespace std;
const int N=10010;
typedef struct Node{
int val;
struct Node* l;
struct Node* r;
Node(int x):val(x),l(NULL),r(NULL){};
}Tnode,*Tree;
int flag=0;
set<int> myset;
//前序建树
Tree build(Tree T)
{
int x;
scanf("%d",&x);
if(x==0){//0 就代表指向空了
return NULL;//所以返回空
}
else{
T=new Node(x);//新建节点
myset.insert(x);
T->l=build(T->l);//建左子树
T->r=build(T->r);//建右子树
}
return T;
}
void Find(Tree T,int x)
{
if(!T||flag) return;//空和找到自然返回
if(T->l&&T->l->val==x){//如果这个的左孩子节点不空,则探索左孩子节点,&&等于要找的值证明找到父节点了
printf("%d\n",T->val);
flag=1;
return ;
}
else if(T->r&&T->r->val==x){
printf("%d\n",T->val);
flag=1;
return ;
}
else{
Find(T->l,x);//继续深入左子树
Find(T->r,x);//深入右子树
}
}
int main()
{
Tree T;
T=build(T);
int n,x;
cin>>n;
while(n--){
flag=0;
cin>>x;
if(T->val==x||!myset.count(x)){
printf("0\n");
continue;
}
Find(T,x);
if(!flag){
printf("0\n");
}
}
}