信息学奥赛一本通 查找二叉树

查找二叉树 

”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差点就退了,今天回来了,开心!

    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/Jerry_wang119/article/details/79179403
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞