查找二叉树 √
”An easy problem“
不过只要你不看错题,基本上就没事;
已知一棵二叉树用邻接表结构存储, 中序查找 二叉树中值为x的结点,并指出是第几个结点。例:如图二叉树的数据文件的数据格式如下:
输入:第一行n为二叉树的结点个树,n≤100;第二行x表示要查找的结点的值;以下第一列数据是各结点的值,第二列数据是左儿子结点编号,第三列数据是右儿子结点编号。
输出:一个数即查找的结点编号。
中序查找贼坑,它规定了每个节点的编号是那个中序遍历的顺序号!而不是层次序,本人一开始就想成层次序了,(给的样例真的很像层次序qwq)
思路:记录每个节点的入度就可以知道那个点是根!然后根据层次序的点来建立一颗树,在树上进行中序遍历赋值它的中序号,最后先序遍历去查找需要的ans,输出具有ans的节点的中序号。(可能会很麻烦qwq,当做练习代码)
给代码了,做好心理准备:
#include<cstdio>
#include<iostream>
using namespace std;
typedef struct node;
typedef node *tree;
struct node{
int data,num,z;
tree lch,rch;
};
tree root;
const int N=10000+5;
int a[N],l[N],r[N],de[N],rt,ans,n,v;
void build(tree &bt,int x){
bt=new node;
bt->num=x;
bt->data=a[x];
if(l[x]!=0)
build(bt->lch,l[x]);
else
bt->lch=NULL;
if(r[x]!=0)
build(bt->rch,r[x]);
else
bt->rch=NULL;
}
void midvisit(tree &bt){
if(bt){
midvisit(bt->lch);
bt->z=++v;
midvisit(bt->rch);
}
return;
}
void visit(tree bt){
if(bt){
if(bt->data!=ans){
visit(bt->lch);
visit(bt->rch);
}
else
cout<<bt->z<<endl;
}
}
int main(){
cin>>n>>ans;
for(int i=1;i<=n;i++){
cin>>a[i]>>l[i]>>r[i];
de[l[i]]++,de[r[i]]++;
}
for(int i=1;i<=n;i++)
if(!de[i]){
rt=i;
break;
}
build(root,rt);
midvisit(root);
visit(root);
return 0;
}
AC掉了!嘻嘻嘻!!
加油啊!TPY同学@Eric_Tang799差点就退了,今天回来了,开心!