• <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>

            C++之竹

            無論是太陽下,還是風(fēng)雨中,都要成長!

            常用鏈接

            統(tǒng)計(jì)

            最新評論

            樹中兩個結(jié)點(diǎn)的最低公共祖先

            <本文的樣例代碼:/Files/qingbizhu/LowestCommonAncestor.zip>
             
            這是《劍指Offer——名企面試官精講典型編程題》一書中的面試題50,此題針對所給條件的不同,將需要截然不同的解題思路和方法。書中給出了針對此題的3種不同條件的解題,本文所要講解的是對其第3種條件的一個改進(jìn)解法。具體的題目及條件如下。
             
            【題目】:
                  輸入兩個樹結(jié)點(diǎn),求它們的最低公共祖先。

            【補(bǔ)充條件】:

                  樹是普通的樹,而且樹中的結(jié)點(diǎn)沒有指向父節(jié)點(diǎn)的指針。

             

            針對上述的題目和條件,書中給出了如下解決方案。

             

            【原方案】:

                  使用兩個鏈表,對樹進(jìn)行兩次遍歷以查找兩個樹結(jié)點(diǎn),并保持路徑到兩個鏈表中,從而將問題轉(zhuǎn)化為求兩個鏈表的最后一個公共結(jié)點(diǎn)。

             

            從該方案中,觀察到兩次樹結(jié)點(diǎn)查找的遍歷中,其中一個結(jié)點(diǎn)的遍歷過的樹結(jié)點(diǎn)序列將完全覆蓋查找另一結(jié)點(diǎn)時所遍歷的樹結(jié)點(diǎn)序列。由此入手,本文提出了如下的改進(jìn)解決方案。

            【改進(jìn)方案】:

                深度優(yōu)先遍歷樹,并記錄路徑,當(dāng)找到第一個結(jié)點(diǎn)后,在當(dāng)前基礎(chǔ)上繼續(xù)遍歷搜索第二個結(jié)點(diǎn),并記錄第一個結(jié)點(diǎn)路徑的變化程度,直到找到第二個結(jié)點(diǎn)。最后,根據(jù)棧信息和記錄的結(jié)點(diǎn)路徑變化程度得到最低公共祖先。如圖1,假設(shè)輸入的兩個樹結(jié)點(diǎn)為DK,樹的根節(jié)點(diǎn)為R,則求DK的最低公共結(jié)點(diǎn)的過程如下表: 

            步驟

            第一個結(jié)點(diǎn)

            第二個結(jié)點(diǎn)

            路徑變化程度

            1

            R

            2

            RA

            3

            RAF

            4

            RAFJ

            5

            RAFG

            6

            RAFK

            K

            0(或K

            7

            RAC

            K

            1(或A

            8

            RACE

            K

            2(或A

            9

            RACI

            K

            2(或A

            10

            RAD

            K

            D

            1(或A

            è 得出結(jié)果,最低公共祖先結(jié)點(diǎn)為A

             

            從中,可以看到,改進(jìn)后的方案,只需對樹執(zhí)行一次遍歷。而在輔助空間的需求上, 只需使用一個棧(外加少量結(jié)點(diǎn)指針變量和1個表示路徑變化程度的整型變量)。而且,如果采用遞歸的方式實(shí)現(xiàn),該棧所需保存的信息,還可以通過遞歸時的函數(shù)調(diào)用棧得以保存。

             

            【附注】:

            1. 此處,有如下一個問題:
              假設(shè)待查找公共祖先的兩樹結(jié)點(diǎn),其中一結(jié)點(diǎn)在以另一結(jié)點(diǎn)為根的子樹上(包括兩結(jié)點(diǎn)相同)時,公共祖先的確定規(guī)則——
              “作為子樹根結(jié)點(diǎn)的那個結(jié)點(diǎn)”還是“子樹根結(jié)點(diǎn)的父節(jié)點(diǎn)”?
              例如:對上面圖1中的那棵樹,如果待查結(jié)點(diǎn)為根結(jié)點(diǎn)R和結(jié)點(diǎn)F,那么最終的查找結(jié)果是為R呢,還是因?yàn)?/span>R是根結(jié)點(diǎn)無父結(jié)點(diǎn)而得出NULL
              此問題在書中未提及,但查看書中代碼,確認(rèn)是選擇了后者;而在本人的樣例代碼中則采用了前面的觀點(diǎn)。
            2. 在樣例代碼中,對樹結(jié)點(diǎn)在棧中的存儲方式略有改動。
            3. 樣例代碼工程所使用的環(huán)境為 Visual C++ 2010;
              其中:tree.h/cpp為功能代碼文件,TestLowestCommonAncestor.h/cpp為相應(yīng)的UT代碼文件;
              UT采用gtest所編寫,編譯鏈接請根據(jù)gtest在自己本機(jī)的路徑狀況修改gtest_link.props文件中相應(yīng)的鏈接項(xiàng)。

             

            posted on 2012-04-05 23:45 青碧竹 閱讀(3092) 評論(0)  編輯 收藏 引用 所屬分類: 算法相關(guān)

            久久精品一本到99热免费| 97久久国产亚洲精品超碰热| 久久久久久久综合日本亚洲| 久久96国产精品久久久| 97久久精品人人做人人爽| 久久精品无码一区二区三区日韩 | 伊人久久久AV老熟妇色| 久久综合给合久久狠狠狠97色| 精品久久久久久成人AV| 久久久久成人精品无码| 久久久久亚洲AV片无码下载蜜桃| 伊人久久综合热线大杳蕉下载| 久久人人添人人爽添人人片牛牛 | 国产成人精品综合久久久| 大香伊人久久精品一区二区| 久久99精品久久只有精品| 日韩欧美亚洲综合久久| 亚洲狠狠久久综合一区77777| 亚洲午夜久久久久妓女影院| 日本高清无卡码一区二区久久| 国产成人久久AV免费| 久久精品极品盛宴观看| 精品久久久久久久久久久久久久久| 亚洲中文字幕无码一久久区| 日韩影院久久| 亚洲国产成人精品女人久久久 | 久久99精品久久久久久hb无码| 欧美无乱码久久久免费午夜一区二区三区中文字幕 | 久久天天躁狠狠躁夜夜av浪潮| 久久夜色tv网站| 久久婷婷久久一区二区三区| 久久天天躁狠狠躁夜夜网站| 久久AV无码精品人妻糸列| 国产精品久久久久久久久软件| 伊人久久亚洲综合影院| 久久久久久午夜精品| 久久午夜福利无码1000合集| 99久久做夜夜爱天天做精品| 亚洲精品乱码久久久久久不卡| 综合久久精品色| 国产69精品久久久久久人妻精品|