德摩根定律與Symmetric Tree

德摩根定律與Symmetric Tree

來自專欄大學生學C語言1 人贊了文章

主動來學計算機的學生,骨子裡大多都有一種「經世致用」的勁頭。這種勁頭功利了一點,但也無可厚非。可往往會和學校的規矩起衝突,比如一些思想政治課的老師我就不是很喜歡,說的好聽一點,叫「嚴肅有餘,活潑不足」,說的難聽點……我就不說了

這種心思多了,就會變得浮躁。我現在開始上概率論的課,上著上著,就發現了我的老朋友:德摩根定律。為什麼說是老朋友呢,很簡單,我模擬與數字電路 學到他,離散數學 學到他,現在概率論我還得再學一遍,連馬甲都不帶換的。

當然,這一定程度上也說明了:知識是相通的這個觀點。但我學了這麼多遍,在計算機里的應用我還一點都不知道,這就有點說不過去了。好在過了幾天,我刷到了一道叫做:Symmetric Tree的題目,才有點明白為什麼要一遍遍學這玩意兒。

題目很簡單:Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).

For example, this binary tree [1,2,2,3,4,4,3] is symmetric:

1

/

2 2

/ /

3 4 4 3

But the following[1,2,2,null,3,null,3]is not:

1

/

2 2

3 3

題目很簡潔,一看就是用遞歸。

(這裡就不得不吐槽一下研究生考試里的:用非遞歸的方法搞樹……你先搞一個棧再搞一個while循環難道就不是遞歸了?你騙誰呢)

思路也很簡單,先判斷是不是空的樹,在遞歸循環檢查子節點。左子樹和右子樹都是空的可以,一邊空一邊不空不行,兩邊都不空必須值一樣。

然後就正常打下代碼 if……else if……else……但刷題有一點很關鍵:要會認慫。果斷去看vote數比較高的代碼,然後我就看到了這個:

if (p == NULL || q == NULL) return (p == q);

一拍大腿,嘿,你還別說,這洋鬼子的鬼點子還真多!

但我隨後意識到,這不是鬼點子,而是用布爾代數列舉出所有情況,再用一系列包括德摩根定律推導出來的東西。擺脫了 if……else 所造成的尷尬,既解決了代碼冗長的問題,又增加了可讀性。我又自己用離散數學課上學到的東西推導了一邊,最後我的答案是這樣:

class Solution {public: bool isSymmetric(TreeNode* root) { if(!root) return true; return helper(root->left,root->right); } bool helper(TreeNode* p,TreeNode* q){ return (!p && !q)||(q && p && q->val == p->val && helper(p->left,q->right) && helper(p->right,q->left)); }};

推導的紙找不到了,雖然這個可能更加「短」,但是犧牲了一些可讀性。有興趣的同學可以自己試試看。

最後說一句,我以前打發時間,看過一本叫《花與劍與法蘭西》的小說。裡面我記得清楚的一點是:名字裡帶著一個「德」的人,往往是貴族或是貴族的後裔。我懶的去查資料,但我想德摩根能成為一個數學家,他貴族身份所能爭取到的良好的教育條件,一定起了很大作用。我們生活在和平年代,國家好歹還算是社會主義國家,能多學點知識,不要不知好歹。就像《倚天屠龍記》裡面謝遜說的:「你現在不管懂不懂先記下,以後自有你的好處。」我自己也覺得除開 有 點 問 題 的思修馬克思老師,政治課書本上的內容還是很有道理的,很有用的。如果大家都能有點唯物史觀,現在這個社會就不會這麼亂了。


推薦閱讀:

暨南大學
2006,中國大學非正常死亡事件--劉安戰
遺址與圖像:牛津大學和芝加哥大學的兩個研究計劃
我如何「白手起家」考上耶魯大學
轉貼:哈佛大學最受歡迎的一堂課:幸福課

TAG:數據結構 | 大學 | C編程語言 |