遞迴對於我來說,典型的一看就會,一寫就廢☺,希望這章總結能給我一點啟發~
by the way,我的文章你快點接收吧!!!
侵刪~這個題解我竟無從下筆,擷取幾個非常清楚的圖來解釋吧~
1)如果l1->val < l2->val,那麼mergetwolist(l2->next , l1);
2)反之,mergetwolist(l2->next , l1);
class solution
if(l2==null)
if(l2->val <= l1->val)
l1->next=mergetwolists(l1->next,l2);
return l1;}};
此時,我依然,一看就會……一做就廢…………
首先插入乙個樹的遍歷知識:
dfs:深度優先搜尋演算法是一種用於遍歷(或搜尋)樹(或圖)的演算法。它沿著樹的深度遍歷樹的節點,盡可能深的搜尋樹的分支,通常借助堆疊實現。最終結果為:abdecfg。
bfs:廣度優先搜尋,是從根節點開始,沿著樹的寬度遍歷樹的節點。如果所有節點均被訪問,則演算法中止,通常借助佇列實現。最終結果為:abcdefg。
1)遞迴:如果乙個樹的左子樹與右子樹映象對稱,那麼這個樹是對稱的。判斷roof節點是否相等 —> 判斷a的左子樹是否等於b的右子樹 —> 判斷a的右子樹是否等於b的左子樹,是一種dfs;
};2)迭代:用佇列,將父節點的左右孩子節點都入隊 —>若全為空則continue —>若不全為空則false —>若不為空則判斷是否相等 —>若相等則將左節點的右孩子節點與右節點的左孩子節點、左節點的左孩子節點與右節點的右孩子節點入隊;
class solution
}return true;
}bool issymmetric(treenode* root)
};
這個遞迴題目是我第乙個有那麼點思路的題目,對的,菜雞沒錯了☺
1)不要去想細節,而是想整體,關注以下幾個點
a.終止條件——當樹為空的時候;
b.應該給上一級返回什麼返回值——樹的深度;
c.在這一級遞迴中應該完成什麼——計算左右子樹的最大值;
這篇博文寫的非常清楚,推薦一下,侵刪。
三道題套路解決遞迴問題lyl0724.github.io
class solution
};
這說明什麼……說明了大佬也會載在遞迴……hhh
1)遞迴終止條件——樹為空;
2)返回上一級的返回值——翻轉後的父節點;
3)本級需要做的——翻轉左右節點,以及左右節點的子節點;
我就是翻轉完左右節點後找不到需要遞迴的地方,忘記了子節點……
class solution
};
這個方法或許更清楚一些:
class solution
};
此題一直沒有思路,一直在想具體的求法,實際應該跳出區域性,從全域性來看1)終止條件:root為空,或者root等於p或q;
2)若p、q分別在root的左右子樹,那麼說明root就是公共祖先;
3)若p、q在root的左子樹,則在左子樹執行2);
4)若p、q在root的右子樹,則在右子樹執行2)。
class solution
};
conclusion:
遞迴的整體思想:只想一層,不去細想到底每一層幹了什麼,跳出區域性想整體
遞迴還是有些不太會,面試時候盡量用迭代or靠運氣
消除文法左遞迴的演算法
1 typedef struct pp 6 typedef struct gg 文法g由多條產生式組成,出現在產生式左部的非終結符,會指向乙個p文法陣列,每乙個陣列元素對應乙個程式的右部,這樣的結構顯然是對文法進行了壓縮的 1 掃瞄文法,先將間接做遞迴轉換成直接左遞迴 2 借助如下公式,消除直接左遞...
消除左遞迴
參考關健young的部落格,左遞迴形式為 1 a a a vn,v 2 a b b a a b vn,v 稱其為左遞迴。其中可以採取修改左遞迴為右遞迴 a a 其中 非空,不以a打頭 可寫為 a a a a 即 a a 1 a 2 a m 1 2 n 其中,i 1 i m 均不為空,j 1 j n ...
消除左遞迴
first集的求法 對於文法g的任一符號串 x1x2 xn可按下列步驟構造其first 集合 1 置first 2 將first x1 中的一切非 符號加進first 3 若 first x1 將first x2 中的一切非 符號加進first 若 first x1 和first x2 將first...