leetcode 101 對稱二叉樹(遞迴思路)

2021-10-04 16:56:05 字數 2076 閱讀 9988

給定乙個二叉樹,檢查它是否是映象對稱的。

例如,二叉樹[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思路 如果同時滿足下面的條件,兩個樹互為映象 它們的兩個根結點具有相同的值。每個樹的右子樹都...