思路
遞歸
大問題:對比 左 右 是否對稱
參數 左和右
todo 先湊合看
代碼
/*** 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 isSymmetricLR(root.left,root.right);}//判斷左樹 和 右數 是否對稱public boolean isSymmetricLR(TreeNode left,TreeNode right) {//都為空if (left == null&&right==null) {return true;}//一個空 一個不空else if (left == null&&right!=null){return false;} else if (left != null&&right==null) {return false;}//都不空,以下://1.判左 和右本身是否不同if (left.val != right.val) {return false;}//2.判斷左左 和右右是否不同//問題轉化成 遞歸調用,其中 left為左左,right為右右if(!isSymmetricLR(left.left, right.right)){return false;}//3.判斷左右 和右左是否不同//問題轉化成 遞歸調用,其中 left為左右,right為右左if(!isSymmetric(left.right, right.left)){return false;}return true;}}
錯誤思路
得到中序遍歷結果 判斷是否對稱
出問題: todo為什么這個不行
/*** 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) {//得到中序遍歷結果 判斷是否對稱,雙指針List<Integer> list = inorderTraversal(root);//定義指針int begin=0;int end=list.size()-1;while (begin<end){if (Objects.equals(list.get(begin), list.get(end))){begin++;end--;}else{return false;}}//退出:等于-相遇 小于-錯開//如果推出循壞還是沒有 不相等,就是對稱序列return true;}//二叉樹中序遍歷public List<Integer> inorderTraversal(TreeNode root) {if (root==null){return new ArrayList<>();}//初始化 listList list=new ArrayList<Integer>();//左子樹//問題轉化為:遍歷以root.left為根的樹,并把結果返回,追加到原來的list上if(root.left!=null) {list.addAll(inorderTraversal(root.left));}//當前list.add(root.val);//右子樹if(root.right!=null) {list.addAll(inorderTraversal(root.right));}return list;}}
總結
1. todo “得到中序遍歷結果 判斷是否對稱” 為什么不行,思考想問題 怎么想更多測試用例
今天感悟:刷題 不在量,在每一題吃透 ,相關拓展也吃透,相關題型都理解