這個題目偶爾看到網上有個解法是這樣的,如下面乙個普通二叉樹
我們要求結點3和結點12的最近共同祖先(指標類同,改變棧的儲存型別即可)。
對樹進行先序遍歷,我們先求從根結點到3得一條路徑,放入棧中,為14-8-5-3;再求得跟結點到12得一條路徑,為14-8-12,也放入棧中。
stackgetstack(tree * t, int data);
stacka = getstack(t, 3);
stackb = getstack(t, 12);
如下圖所示
我們需要從棧底遍歷,找到最後乙個相同的元素即為要求的祖先。但是棧只能從棧頂操作,所以我們需要將兩個棧反轉,如下圖
我們將14出棧,8出棧,然後下乙個元素不相同,則8既是我們所求。
改進:上面的方法有些繁瑣,下面具體說下改進的方法。
1、上述方法求棧用了兩個遍歷,可否用一次遍歷呢?當然可以,可以設定兩個全域性變數,如棧a、b,當找到第乙個結點(假設是3)之後a不在變化,將a賦給b,當找到第二個結點(假設是12)之後b不再變化,當兩者都找到後,退出函式。
2、緊接著我們看到棧還需要反轉一下,這勢必會增加時間和空間複雜度。我們觀察兩個棧的特點,我們發現從棧底開始都是兩個結點的相同祖先,那麼我們如果先把左邊的3出棧,此時兩個棧中得元素個數便相同了,此時兩個棧一次乙個出棧,直到有相同的元素出棧,便得所求。
所以我們只需找出兩個棧的元素個數差d,然後將元素個數多的棧先出棧d個元素。
左邊棧中有4個元素,右邊有3個元素,d=4-3=1,左邊要先出棧乙個元素,先出棧元素 3。此時兩個棧元素個數相同,然後同時出棧,5、12不同,出棧繼續,8相同,結束。
二叉樹 查詢兩個任意節點的最近祖先
很久沒有用過二叉樹了,最近由於需要用到了,發現很多知識需要鞏固了,中間涉及到乙個演算法就是找任意兩個節點的最近祖先。通過本人回顧和演算,最終提出了下面乙個方法,網上也有很多其他的方式實現,再次僅對自己好幾個小時的工作作個記錄和積累吧!程式是用c語言寫的,個人覺得如果用c 實現會更加方便。首先是資料結...
二叉樹兩個結點的最低共同父節點
後序遍歷就行。尋找二叉樹兩個結點的最低共同父節點 treenode findfirstcommonparentnode treenode proot,treenode pnodeone,treenode pnodetwo if proot pnodeone proot pnodetwo treeno...
找出二叉樹上任意兩個節點的最近共同父節點
include includestruct node void creatree node p,int a,int start,int end 使用 p的原因 要在函式體內修改形參的值,並且這個修改能作用到外面呼叫的實參,用單獨的指標就不行,只能用指標的引用或者指標的指標 else return i...