1. 程式人生 > >資訊學奧賽一本通 查詢二叉樹

資訊學奧賽一本通 查詢二叉樹

查詢二叉樹 

”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差點就退了,今天回來了,開心!