資訊學奧賽一本通 查詢二叉樹
阿新 • • 發佈:2019-02-01
查詢二叉樹 √
”An easy problem“ 不過只要你不看錯題,基本上就沒事;已知一棵二叉樹用鄰接表結構儲存, 中序查詢 二叉樹中值為x的結點,並指出是第幾個結點。例:如圖二叉樹的資料檔案的資料格式如下:
輸入:第一行n為二叉樹的結點個樹,n≤100;第二行x表示要查詢的結點的值;以下第一列資料是各結點的值,第二列資料是左兒子結點編號,第三列資料是右兒子結點編號。
輸出:一個數即查詢的結點編號。
中序查詢賊坑,它規定了每個節點的編號是那個中序遍歷的順序號!而不是層次序,本人一開始就想成層次序了,(給的樣例真的很像層次序qwq) 思路:記錄每個節點的入度就可以知道那個點是根!然後根據層次序的點來建立一顆樹,在樹上進行中序遍歷賦值它的中序號,最後先序遍歷去查詢需要的ans,輸出具有ans的節點的中序號。(可能會很麻煩qwq,當做練習程式碼) 給程式碼了,做好心理準備:
AC掉了!嘻嘻嘻!! 加油啊!TPY同學@Eric_Tang799差點就退了,今天回來了,開心!#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; }