一直對遞迴用的太機械,每寫乙個遞迴都想一下子想到方方面面,扣清除每個位置的語句執行時會發生什麼,本是優點,但是由於遞迴的深度,完全靠大腦想象整個過程相當複雜。
最近看到了劍指offer上的兩個遞迴題(我想過用別的方法,但是沒想出來,也沒查出來,而且好的遞迴函式邏輯性很強),感覺如果建模建的好,邏輯清晰,遞迴真的是很方便的。但是建模建的好,邏輯清晰不是說說就有的,需要鍛鍊。
輸入兩棵二叉樹a和b,判斷b是不是a的子結構。
如圖a樹和b樹,先將a樹根和b樹根進行比較,相等,繼續將a樹左子樹和b樹左子樹比較,不相等,當前這次比較結束。將a的左子樹為根,繼續重複上面的比較工作,若存在b樹結構則返回true;不存在的話,以a的右子樹為根和b樹進行比較。
總結:上面有兩個遞迴過程,
第乙個是整體上的:以當前節點為根與b樹比較,若比較結果為真則返回true;否則,以當前節點左子樹結點為根進行比較,為真返回true;否則,以當前結點右子樹結點為根繼續判斷。
bool hassubtree(treenode* proot1, treenode* proot2)
bool result = false;
//不為真就一直往下比較,為真就退出。
result = issubtree(proot1, proot2);
if (!result)
if (!result)
return result;
}```
第二個是比較的過程:若a樹當前結點與b樹當前結點相同,比較a樹當前結點左子樹中是否有b樹當前結點左子樹結構,a樹當前結點右子樹中是否有b樹當前結點右子樹的結構,若均有返回true。
:bool issubtree(treenode*proot1, treenode*proot2)
if (proot1->val == proot2->val)
}return
false;
}
沒有直接用劍指offer中的**第一是因為理解了,第二是認為分別判斷左右子樹是否issubtree有乙個好處就是如果左子樹存在不同,就可以直接返回false,不用再判斷右子樹。雖然節省了一點點,但也是改進:)。
這個題在我看來真的要和出題人溝通,其實有很多省事的辦法,如果最後返回的鍊錶可以是重新創造的陣列的話,這個問題完全可以用陣列合併排序的方式;如果不可以,還是老老實實按照遞迴的模型走吧
時間不多,上**:
listnode* merge(listnode* phead1, listnode* phead2)
else
current->next = merge(phead1, phead2);
return current;
}
每次求剩餘兩個鍊錶的最小結點,返回;需要的注意的是,鍊錶中一定不要忘記了結點之間的連線關係。 劍指offer 樹的子結構
華電北風吹 天津大學認知計算與應用重點實驗室 日期 2015 9 30 題目描述 輸入兩顆二叉樹a,b,判斷b是不是a的子結構。解析 解決樹類問題的時候遞迴是乙個很好的解決方案,並且寫的程式簡單,理解起來也很容易。遞迴的時候謝了乙個函式來判斷當前兩個根節點對應的子樹是否相等 issubtree 不想...
劍指offer 樹的子結構
題目描述 輸入兩顆二叉樹a,b,判斷b是不是a的子結構。這實際上二叉樹遍歷演算法的一種應用,要在原二叉樹中查詢是否具有某課子樹,只需要判斷每個節點是否都在二叉樹中是否出現即可。所以需要先判斷頭結點,只有頭結點符合要求才繼續比較其子樹是否符合,一樣依次從頭結點開始比較直到其左右子樹進行比較,如果都符合...
劍指offer 樹的子結構
大體思路如下 在程式遞迴過程中,記得注意遞迴的出口以及空指標的處理 主程式中在root1 root2非空的條件下才能去判斷 判斷judge函式中,一些邊界出口為 if root2 null return true if root1 null return false public class sol...