1. 題目
給你一個二叉樹的根節點 root , 檢查它是否軸對稱。
示例 1:
輸入:root = [1,2,2,3,4,4,3]
輸出:true
示例 2:
輸入:root = [1,2,2,null,3,null,3]
輸出:false
2. 題解
/*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val = val; }* TreeNode(int val, TreeNode left, TreeNode right) {* this.val = val;* this.left = left;* this.right = right;* }* }*/
class Solution {public boolean isSymmetric(TreeNode root) {return root == null || recur(root.left,root.right);}boolean recur(TreeNode L , TreeNode R){if(L == null && R == null) return true;if(L == null || R == null || L.val != R.val) return false;return recur(L.left , R.right) && recur(L.right , R.left);}
}
3. 解析
-
public boolean isSymmetric(TreeNode root): 這是主方法,接收一個類型為TreeNode的參數root。這個參數表示二叉樹的根節點。如果輸入的根節點(也就是整個二叉樹)不存在或者左子樹和右子樹對稱(即recur函數返回true),那么方法返回true;否則,返回false。
-
boolean recur(TreeNode L , TreeNode R){: 這是輔助遞歸方法。它接收兩個類型為TreeNode的參數L和R,分別表示左子樹的根節點和右子樹的根節點。如果兩棵子樹都為空(即它們都是葉節點或空樹),那么這個函數返回true;否則,它會判斷以下條件:
- 如果其中一棵子樹為空但另一棵不為空,那么這兩棵子樹不能被視為鏡像。因此,這兩個分支的遞歸調用都將返回false。
- 如果兩棵子樹都不為空且它們的根節點的值相等(即這些位置上的元素相同),那么我們需要比較左子樹的左孩子和右子樹的右孩子以及左子樹的右孩子和右子樹的左孩子。只有當這兩個條件都滿足時(也就是說兩棵子樹是鏡像對應的),這個函數才返回true。
- return recur(L.left , R.right) && recur(L.right , R.left);: 在上面的條件判斷之后,我們使用這行代碼來遞歸地調用輔助方法recur(),以比較左子樹的左孩子和右子樹的右孩子以及左子樹的右孩子和右子樹的左孩子。
- 如果這兩組節點(左子樹的左孩子和右子樹的右孩子;以及左子樹的右孩子和右子樹的左孩子)都滿足條件,那么這兩個函數調用將返回true,并且整個表達式recur(L.left , R.right) && recur(L.right , R.left)也將返回true。
- 否則,它會返回false。