• <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++之竹

            無論是太陽下,還是風雨中,都要成長!

            常用鏈接

            統計

            最新評論

            樹中兩個結點的最低公共祖先

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

            【補充條件】:

                  樹是普通的樹,而且樹中的結點沒有指向父節點的指針。

             

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

             

            【原方案】:

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

             

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

            【改進方案】:

                深度優先遍歷樹,并記錄路徑,當找到第一個結點后,在當前基礎上繼續遍歷搜索第二個結點,并記錄第一個結點路徑的變化程度,直到找到第二個結點。最后,根據棧信息和記錄的結點路徑變化程度得到最低公共祖先。如圖1,假設輸入的兩個樹結點為DK,樹的根節點為R,則求DK的最低公共結點的過程如下表: 

            步驟

            第一個結點

            第二個結點

            路徑變化程度

            1

            R

            2

            RA

            3

            R,A,F

            4

            RA,F,J

            5

            RA,F,G

            6

            RA,F,K

            K

            0(或K

            7

            R,A,C

            K

            1(或A

            8

            R,ACE

            K

            2(或A

            9

            R,A,C,I

            K

            2(或A

            10

            RA,D

            K

            D

            1(或A

            è 得出結果,最低公共祖先結點為A

             

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

             

            【附注】:

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

             

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

            国产精品视频久久久| 99久久精品国产一区二区| 久久se精品一区二区| 99久久精品免费看国产一区二区三区 | 久久久久久久人妻无码中文字幕爆 | 国产精品一区二区久久精品涩爱 | 99久久国产综合精品五月天喷水| 久久精品国产精品亚洲| 97精品伊人久久久大香线蕉| 亚洲国产精品婷婷久久| 熟妇人妻久久中文字幕| 狠狠综合久久综合中文88| 亚洲人成网亚洲欧洲无码久久| 97久久精品人人澡人人爽| 久久久久久国产精品无码下载| 丰满少妇人妻久久久久久4| 精品多毛少妇人妻AV免费久久| 国产高潮国产高潮久久久91 | 久久久久久国产a免费观看不卡| 色欲综合久久躁天天躁蜜桃| 亚洲一级Av无码毛片久久精品| 久久婷婷综合中文字幕| 无码人妻精品一区二区三区久久 | 午夜天堂精品久久久久| 亚洲国产精品嫩草影院久久| 精品久久久久久国产免费了| 日本福利片国产午夜久久| 91精品国产综合久久婷婷| 久久久久女人精品毛片| 亚洲精品乱码久久久久久中文字幕 | 久久久国产精品福利免费| 色诱久久久久综合网ywww| 亚洲av成人无码久久精品| 色综合久久综合中文综合网 | 国内精品久久久久久久亚洲| 久久免费视频网站| 国产99久久久国产精免费| 久久亚洲av无码精品浪潮| 日韩欧美亚洲国产精品字幕久久久 | 久久www免费人成看片| 伊人久久大香线蕉av一区|