青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-80  評(píng)論-24  文章-0  trackbacks-0

在樹(shù)這種數(shù)據(jù)結(jié)構(gòu)中,有時(shí)候需要知道兩個(gè)節(jié)點(diǎn)的最近的公共祖先。
我們經(jīng)常只需要知道某兩個(gè)節(jié)點(diǎn)的公共祖先,這樣最簡(jiǎn)單的遞歸算法即可解決問(wèn)題,分析如下:

1、對(duì)于當(dāng)前節(jié)點(diǎn)t,如果其是要查詢(xún)的兩個(gè)節(jié)點(diǎn)a和b中的一個(gè),則直接返回t;
2、否則如果a和b都在t的左子樹(shù)或者右子樹(shù)中,則遞歸左子樹(shù)或右子樹(shù)
3、直到a和b分屬t的左子樹(shù)與右子樹(shù)為止。

后序遍歷二叉樹(shù)的遞歸算法如下:

 1 typedef struct lca
 2 {
 3     int data;
 4     struct lca *left, *right;
 5 } lca;
 6 
 7 int LCA(lca *root, lca *a, lca *b, lca **result)
 8 {
 9     int l, r;
10     if (root == NULL)
11         return 0;
12     if ((l = LCA(root->left, a, b, result)) == 2return 2;
13     if ((r = LCA(root->right, a, b, result)) == 2return 2;
14     if (l + r == 2) { *result = root; return 2; }
15     if (root == a || root == b) {
16         if (l + r == 1) { *result = root; return 2; }
17         return 1;
18     }
19     return l + r;
20 }
21 


算法結(jié)果即最近公共祖先節(jié)點(diǎn)在result中。

不過(guò)有時(shí)候我們的查詢(xún)量很大,針對(duì)同一顆樹(shù)有成百上千次查詢(xún),這樣上面的算法效率就太低了,不過(guò)不要急,Tarjan算法派上用場(chǎng)了~
Tarjan算法是一種離線算法,意思就是給定一棵樹(shù),然后給定若干詢(xún)問(wèn),先緩存所有詢(xún)問(wèn),然后再一次性的給出所有詢(xún)問(wèn)的回答。
設(shè)定如下數(shù)據(jù)結(jié)構(gòu):

1 vector<int> tree[MAX_NODE];
2 vector<int> query[MAX_QUERY];


由上面可知,樹(shù)是有鄰接表存儲(chǔ)的(這樣也是為了節(jié)約空間)。對(duì)于查詢(xún),如(3, 5),query[3][5] 和query[5][3]都需要被置為1。
先看模板吧:

 1 int find(int x)
 2 {
 3     if (x == parent[x])
 4     {
 5         return x;
 6     }
 7     else
 8     {
 9         parent[x] = find(parent[x]);
10     }
11 
12     return parent[x];
13 }
14 
15 void merge(int x, int y)
16 {
17     parent[y] = x;
18 }
19 
20 void LCA_Tarjan(int u)
21 {
22     int i;
23     parent[u] = u;
24 
25     for (i = 0; i < tree[u].size(); ++i)
26     {
27         LCA_Tarjan(tree[u][i]);
28         merge(u, tree[u][i]);
29         anscestor[find(u)] = u;
30     }
31 
32     checked[u] = 1;
33 
34     for (i = 0; i < query[u].size(); ++i)
35     {
36         if (checked[query[u][i]] == 1)
37         {
38             res = anscestor[find(query[u][i])];
39         }
40     }
41 }
42 


其中find(x)、merge(x, y)是并查集(不知道并查集?去翻翻《算法導(dǎo)論》吧!)的標(biāo)準(zhǔn)操作,函數(shù)功能分別是尋找x的根節(jié)點(diǎn);合并x和y這兩棵樹(shù),將y的根節(jié)點(diǎn)的父指針指向x。
核心操作當(dāng)然是LCA_Tarjan(u)了。它的思想如下:
1、看遞歸就知道其實(shí)還是深度遍歷這棵樹(shù);
2、首先使當(dāng)前節(jié)點(diǎn)u的父指針指向自己;
3、處理u的所有孩子節(jié)點(diǎn),每處理完一個(gè)孩子節(jié)點(diǎn)就讓孩子節(jié)點(diǎn)的父指針指向u,即將孩子節(jié)點(diǎn)所在的集合與u的集合合并;
4、u的全部孩子處理完畢則將u標(biāo)記為處理結(jié)束,即checked[u] = 1;
5、處理所有和u相關(guān)的詢(xún)問(wèn),比如query[u][i] = v,則如果v已經(jīng)被處理結(jié)束,則u和v必然處在一棵并查集樹(shù)上,并且這棵樹(shù)的根節(jié)點(diǎn)一定是他們的公共祖先
(為什么?畫(huà)圖找實(shí)例然后手動(dòng)運(yùn)行一遍不難理解,因?yàn)?span style="color: #ff0000">每個(gè)節(jié)點(diǎn)(比如為x)運(yùn)行完之后就將x的父指針指向它的父親(這時(shí)父親節(jié)點(diǎn)的父指針依然指向自己),然后再去運(yùn)行x的兄弟節(jié)點(diǎn),這時(shí)兄弟節(jié)點(diǎn)下的某個(gè)節(jié)點(diǎn)(比如y)如果在查詢(xún)中,且查詢(xún)?nèi)绻『檬?y, x的子孫),則x所在并查集樹(shù)中的根節(jié)點(diǎn)一定是x的父節(jié)點(diǎn),而這個(gè)父節(jié)點(diǎn)也是y的祖先,因此可知(y, x的子孫)的祖先一定包含x的父節(jié)點(diǎn),由上面過(guò)程知道不能可包含比x的父節(jié)點(diǎn)更低的祖先節(jié)點(diǎn),因此x的祖先節(jié)點(diǎn)必然是(y, x的子孫)的最近公共祖先
);這樣說(shuō)必然很難理解,不過(guò)找個(gè)真正的實(shí)例運(yùn)行一遍就一目了然了~

posted on 2011-05-12 21:42 myjfm 閱讀(3196) 評(píng)論(0)  編輯 收藏 引用 所屬分類(lèi): 算法基礎(chǔ)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久亚洲私人国产精品va| a91a精品视频在线观看| 欧美一区2区三区4区公司二百| 国产精品久久久999| 亚洲一区二区在| 亚洲一区二区成人| 国产亚洲精品7777| 欧美激情精品久久久久久黑人| 久久亚洲欧美| 亚洲深夜激情| 欧美一区二区视频观看视频| 国产专区综合网| 91久久久久久| 欧美体内she精视频在线观看| 香蕉成人久久| 久久久免费精品视频| 亚洲激情av| 亚洲小说欧美另类婷婷| 韩国亚洲精品| 亚洲国产福利在线| 国产精品每日更新在线播放网址| 久久精品首页| 欧美二区在线观看| 久久精品1区| 农村妇女精品| 久久av一区二区三区亚洲| 久久在线视频在线| 亚洲欧美一区二区视频| 久久婷婷久久一区二区三区| 一级日韩一区在线观看| 久久精品成人| 亚洲私人影院在线观看| 久久久久久综合网天天| 在线亚洲自拍| 免费视频一区| 久久人人爽人人| 国产精品第一区| 免费成人性网站| 国产精品夜夜嗨| 亚洲国产婷婷| 精品电影在线观看| 亚洲欧美日韩国产中文| 999亚洲国产精| 久久另类ts人妖一区二区| 亚洲一区二区三区在线观看视频 | 久久深夜福利| 国产精品成人免费| 亚洲国产另类精品专区| 国内伊人久久久久久网站视频| 亚洲久久成人| 亚洲精品日韩精品| 久久婷婷麻豆| 久热re这里精品视频在线6| 国产精品羞羞答答xxdd| 亚洲精品一区二区三| 亚洲国产精品第一区二区| 性做久久久久久| 性欧美激情精品| 国产精品黄视频| 一本色道久久综合亚洲精品按摩| 日韩视频不卡| 欧美a级大片| 亚洲国产精彩中文乱码av在线播放| 国产综合第一页| 欧美在线视频日韩| 久久久国产精品一区| 国产精品自拍一区| 欧美亚洲网站| 久久久之久亚州精品露出| 国产亚洲综合精品| 欧美一区日韩一区| 久久免费视频在线| 国产一区二区在线免费观看| 欧美一级黄色网| 久久嫩草精品久久久久| 激情伊人五月天久久综合| 久久精品视频亚洲| 免费欧美日韩| 99re6这里只有精品| 欧美日韩在线不卡一区| 一区二区三区四区五区精品视频| 亚洲影院在线观看| 国产女同一区二区| 久久国产一区二区| 欧美激情女人20p| 99精品久久| 国产欧美日韩一区二区三区在线| 性欧美在线看片a免费观看| 久久噜噜亚洲综合| 亚洲国产日韩美| 欧美日韩一区二区精品| 亚洲免费伊人电影在线观看av| 久久久久久亚洲精品杨幂换脸 | 亚洲精品国产精品国自产在线| 欧美成在线视频| av成人动漫| 久久久久久久久久久一区| 伊人婷婷欧美激情| 欧美日韩一区二区欧美激情 | 亚洲国产精品日韩| 亚洲综合精品| 亚洲东热激情| 国产精品欧美激情| 媚黑女一区二区| 亚洲中午字幕| 亚洲欧洲精品一区二区三区波多野1战4| 亚洲综合日韩| 亚洲激情在线观看视频免费| 欧美亚州一区二区三区| 久久精品日产第一区二区| 亚洲精品影院在线观看| 久久久免费精品视频| 99riav1国产精品视频| 国产性天天综合网| 欧美日韩国产影院| 久久亚洲欧洲| 亚洲欧美偷拍卡通变态| 亚洲黄色尤物视频| 噜噜爱69成人精品| 欧美一进一出视频| 一区二区三区日韩| 亚洲成人在线观看视频| 国产麻豆日韩欧美久久| 欧美精品在线观看91| 久久九九99视频| 亚洲欧美日韩直播| 亚洲视频电影图片偷拍一区| 亚洲欧洲一区二区在线观看 | 亚洲欧美日韩精品久久| 亚洲欧洲另类| 在线电影一区| 国产一区二区在线观看免费| 国产精品久久久久久亚洲毛片 | 久久蜜桃av一区精品变态类天堂| 一道本一区二区| 亚洲欧洲一区二区三区久久| 免费的成人av| 老牛嫩草一区二区三区日本 | 亚洲精品美女久久久久| 黄色精品一二区| 国产亚洲综合精品| 国产日韩一区二区三区在线| 欧美午夜精品理论片a级大开眼界 欧美午夜精品理论片a级按摩 | 欧美国产乱视频| 农村妇女精品| 欧美激情影院| 亚洲第一精品夜夜躁人人爽| 欧美激情精品久久久| 女人色偷偷aa久久天堂| 欧美成人午夜影院| 欧美高清视频www夜色资源网| 美女脱光内衣内裤视频久久影院| 乱码第一页成人| 久久综合九九| 亚洲黄色片网站| 日韩午夜在线播放| 夜夜嗨网站十八久久| 亚洲一区欧美| 久久成人国产| 久色婷婷小香蕉久久| 欧美a级一区二区| 欧美日韩成人| 国产精品黄视频| 国内精品久久久久影院 日本资源 国内精品久久久久伊人av | 亚洲自拍电影| 久久国产精品电影| 免费久久精品视频| 欧美日韩在线视频首页| 国产精品美女久久久久aⅴ国产馆| 国产精品久久久久999| 国产毛片一区二区| 亚洲第一视频| 亚洲视频在线看| 久久久之久亚州精品露出| 欧美激情第1页| 日韩亚洲视频在线| 欧美一级视频免费在线观看| 久久综合网络一区二区| 欧美日韩精品一区二区天天拍小说 | 免费h精品视频在线播放| 欧美激情偷拍| 国产精品一区二区你懂的| 亚洲成色www8888| 中文亚洲欧美| 欧美成人精品一区二区| 亚洲一区免费| 免费成人在线观看视频| 国产精品v日韩精品| 亚洲成色最大综合在线| 亚洲视频在线播放| 欧美成人第一页| 在线一区二区日韩| 欧美xx视频| 国产亚洲精品bv在线观看| 夜夜嗨一区二区三区| 欧美.日韩.国产.一区.二区| 亚洲女同性videos| 欧美日韩1区2区3区| 原创国产精品91| 欧美专区在线观看|