c 消除左遞迴文法 遞迴(Leetcode)

2021-10-13 16:37:07 字數 2747 閱讀 1090

遞迴對於我來說,典型的一看就會,一寫就廢☺,希望這章總結能給我一點啟發~

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