給定乙個二叉樹,檢查它是否是映象對稱的。
例如,二叉樹[1,2,2,3,4,4,3]
是對稱的。
1
/ \ 2
2/ \ / \34
43
但是下面這個[1,2,2,null,3,null,3]
則不是映象對稱的:
1
/ \ 2
2 \ \33
說明:如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。
1.首先弄清楚「對稱」一詞的含義,首先我們知道,一棵如題所述的映象對稱二叉樹,從根結點出發,應該是——如下圖示同顏色的節點一般,對應的節點的值相等。
2.現在開始考慮寫遞迴函式,看著上圖假設,我們應該怎樣才能設計乙個遞迴函式,可以從根節點開始,向兩邊擴充套件,同步到達no.1,no.2,no.3這樣的一組組節點呢?
請注意,以上的這段話實則已經點明了遞迴函式的幾個要點。
1.基於根節點。顯而易見,只要我們保證從根節點開始,左右子樹同時行動,並遵循一定的規律,滿足第三點就是順理成章的事情了。(可能有點難以理解,看下去就懂了)2.是同時向兩邊擴充套件的。
3.同步到達像no.1,no.2,no.3這樣的一組組節點。
前方高能
那麼,如何保證從根節點開始,左右子樹同時行動,並遵循一定的規律?
顯然,如果要保證左右子樹同時行動,該遞迴函式應該要有兩個指標,like this:
class
solution
private
:bool
digit
(treenode* a, treenode* b)
};
我們再假設根節點的深度為0,以下逐層+1,如下圖所示:
現在思考,如果我們已經確保,兩個指標已經分別指向了相同顏色的兩個節點,那麼下一步應該如何行動,才能確保它們依舊指向相同顏色的兩個節點呢?
很簡單,「如果乙個指標向左子樹移動,則另乙個向右子樹移動;如果向右子樹移動,則另乙個向左子樹移動。」總而言之,兩個指標的移動方向應該是相反的,並且都是向深度+1 的方向移動,才能確保它們依舊指向同一組。
從根節點出發,兩個指標分別向左、右子樹移動,遵循左右方向相反,向下直到葉子節點為止的原則,同時比對指標所指向的點的數值是否相等,如果不相等或者其中乙個指標無路可走,則返回false
,如果一直安然無恙直到兩個指標同時走到盡頭,就可以返回true
。
以下是**:
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
private
:bool
digit
(treenode* a, treenode* b)
};
但是,這樣還是錯誤,為什麼呢?
呵呵,我們還需要加上一條語句,判斷樹是否為空。
這是最後的雙100%**:
/**
* definition for a binary tree node.
* struct treenode
* };
*/class
solution
private
:bool
digit
(treenode* a, treenode* b)
};
LeetCode 101 對稱二叉樹
給定乙個二叉樹,檢查它是否是它自己的映象 即,圍繞它的中心對稱 例如,這個二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3 但是下面這個 1,2,2,null,3,null,3 則不是 1 2 2 3 3 說明 如果你可以遞迴地和迭代地解決它就獎勵你點數。建立乙個映象的樹,然...
LeetCode(101) 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3說明 如果你可以運用遞迴和迭代兩種方法解決這個問題,會很加分。這道題也是劍指offer上的2...
leetcode 101 對稱二叉樹
給定乙個二叉樹,檢查它是否是映象對稱的。例如,二叉樹 1,2,2,3,4,4,3 是對稱的。1 2 2 3 4 4 3但是下面這個 1,2,2,null,3,null,3 則不是映象對稱的 1 2 2 3 3思路 如果同時滿足下面的條件,兩個樹互為映象 它們的兩個根結點具有相同的值。每個樹的右子樹都...