題目如下:(題目鏈接戳我)

對(duì)稱(chēng)二叉樹(shù)
以下是我的解題思路:
我接觸過(guò)的二叉樹(shù)的題目,大多都可以用遞歸方式來(lái)解題,所以只需要找到規(guī)律,然后方法內(nèi)部再調(diào)用一次自己就可以。
我們就拿這個(gè)模型來(lái)分解:

左邊的2和右邊的2比較
左邊的3和右邊的3比較
左邊的4和右邊的4比較
抽象出來(lái)就是:
1 的左子(2) VS 1 的右子(2);
1 的左子(2)的左子(3) VS 1 的右子(2)的右子(3)
1 的左子(2)的右子(4) VS 1 的右子(2)的左子(4);
再加一層呢。

繼續(xù)抽象,這里容易搞暈,要再之前的基礎(chǔ)上遞歸,而不能偏到樹(shù)的某一側(cè)了,比如下邊這樣就走錯(cuò)了:

剛才我們走到了:
1 的左子(2)的左子(3) VS 1 的右子(2)的右子(3)
1 的左子(2)的右子(4) VS 1 的右子(2)的左子(4);
繼續(xù)前進(jìn),就是:
1 的左子(2)的左子(3)的左子(5) VS 1 的右子(2)的右子(3)的左子(5)
1 的左子(2)的左子(3)的右子(6) VS 1 的右子(2)的右子(3)的左子(6)
1 的左子(2)的右子(4)的左子(7) VS 1 的右子(2)的左子(4)的右子(7)
1 的左子(2)的右子(4)的右子(8) VS 1 的右子(2)的左子(4)的左子(8)
不能再向下吧,有點(diǎn)暈了,還是上代碼吧。
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
return isSame(root, root);
//下邊的寫(xiě)法,沒(méi)有上邊巧妙;
// if(root == null){
// return true;
// }else{
// return isSame(root.left, root.right);
// }
}
public boolean isSame(TreeNode node1, TreeNode node2){
if(node1 == null && node2 == null){
return true;
}else if(node1 == null || node2 == null){
return false;
}else{
return node1.val == node2.val && isSame(node1.left, node2.right) && isSame(node1.right, node2.left);
}
}
}
代碼中的之前抽象的基礎(chǔ)上又增加了一些特殊情況的處理。