hdu 4605 線段樹與二叉樹遍歷

2022-05-22 07:30:12 字數 2524 閱讀 6584

思路:

首先將所有的查詢有乙個vector儲存起來。我們從1號點開始dfs這顆二叉樹,用線段樹記錄到當前節點時,走左節點的有多少比要查詢該節點的x值小的,有多少大的,

同樣要記錄走右節點的有多少比x小的,多少比x大的。小和大的x,y值題目給了。當要進行左兒子時,建該節點值插入走左的線段樹,回退的時候將其刪除,進入右兒子時將其插入走右的線段樹,同樣回退時刪除。遍歷完乙個樹,整個查詢就做完了,最後輸出。

#include#include

#include

#include

#include

#include

#define maxn 200100

#define lson(x) (x<<1)

#define rson(x) ((x<<1)+1)

#define mid ((tree[po].l+tree[po].r)>>1)

#define inf 100000000

using

namespace

std;

struct

query;

struct

aaans[maxn];

struct

treetree[maxn*20

];int head[maxn],e,w[maxn],index[maxn],flag=0

,l,r,lsum,rsum;

vector

query[maxn];

struct

edgeedge[maxn];

void buildtree(int l,int r,int

po)void insert(int val,int po,int

type)

if(type)

tree[po].rnum++;

else

tree[po].lnum++;

if(index[mid]>=val)

insert(val,lson(po),type);

else

insert(val,rson(po),type);

}void del(int val,int po,int

type)

if(type)

tree[po].rnum--;

else

tree[po].lnum--;

if(index[mid]>=val)

del(val,lson(po),type);

else

del(val,rson(po),type);

}void get_num(int val,int

po)

if(tree[po].l==tree[po].r)

get_num(val,lson(po));

get_num(val,rson(po));

}void

init()

}void add(int u,int

v)void dfs(int u)//

進行二叉樹遍歷

ans[query[u][i].i].y+=l*3

; ans[query[u][i].i].y+=lsum-l;

ans[query[u][i].i].y+=r*3

; ans[query[u][i].i].y+=rsum-r;

ans[query[u][i].i].x+=r;

}int f=0

;

for(i=head[u];i!=-1;i=edge[i].next)

else

f++;

dfs(edge[i].v);

if(f==2

)

else

}}int

main()

sort(index+1,index+n+1

); num=1

;

for(i=2;i<=n;i++)//

將座標離散化

if(index[i]>index[num])

index[++num]=index[i];

buildtree(

1,num,1);//

建立線段樹

scanf("

%d",&m);

for(i=1;i<=m;i++)

scanf("%d

",&q);

query temp;

intv;

for(i=1;i<=q;i++)//

將所有查詢儲存起來

int f=0;//

標記走左還是右

for(i=head[1];i!=-1;i=edge[i].next)//

從1號節點開始遍歷

else

f++;

dfs(edge[i].v);

if(f==2

)

else

}for(i=1;i<=q;i++)

}return0;

}

二叉樹 滿二叉樹與完全二叉樹

二叉樹 binary tree 是n n 0 個元素的有限集合,該集合為空或者為由乙個稱為 根 的元素及兩個不相交的 被分別稱為左子樹和右子樹的二叉樹組成 二叉樹的基本特點 每個結點最多有兩棵子樹 左子樹和右子樹是有順序的,且不可顛倒 圖一1 結點 二叉樹中的每乙個元素都稱為結點。通常二叉樹的許多名...

hdu1710(二叉樹的歷遍)

題意 依次給出二叉樹的前序歷遍和中序歷遍,要你輸出它的後序歷遍。感嘆 這個題目,我不得不感慨用遞迴解決二叉樹的問題真心碉堡了。也不得不感嘆,自己還是太水了,記得以前我的乙個學長做這個題目,沒超過十分鐘後就ac了。思路 用遞迴做的巨集觀思路很簡單,就是結合前序歷遍和中序歷遍,找根節點,在中序歷遍中,根...

hdu1710(二叉樹的歷遍)

題意 依次給出二叉樹的前序歷遍和中序歷遍,要你輸出它的後序歷遍。感嘆 這個題目,我不得不感慨用遞迴解決二叉樹的問題真心碉堡了。也不得不感嘆,自己還是太水了,記得以前我的乙個學長做這個題目,沒超過十分鐘後就ac了。思路 用遞迴做的巨集觀思路很簡單,就是結合前序歷遍和中序歷遍,找根節點,在中序歷遍中,根...