[leetcode] 101. 對稱二叉樹
阿新 • • 發佈:2018-11-06
一開始想複雜了呀,沒有做出來
直觀的思路就是反轉這顆樹,然後判斷兩顆樹是不是相同的
class Solution { // 反轉並建立一顆樹 public TreeNode reverseTreeNode(TreeNode root) { if (null == root) return null; TreeNode tmp = new TreeNode(root.val); tmp.left = reverseTreeNode(root.right); tmp.right = reverseTreeNode(root.left); return tmp; } public boolean isSame(TreeNode t1, TreeNode t2) { if (t1 == null && t2 == null) return true; if (t1 == null || t2 == null) return false; if (t1.val != t2.val) return false; else return isSame(t1.left,t2.left) && isSame(t1.right,t2.right); } public boolean isSymmetric(TreeNode root) { if (null == root) return true; TreeNode newTree = reverseTreeNode(root); return isSame(newTree,root); } }
網上大部分人的思路更為簡潔,一開始沒有想到。
即,判斷左子樹和右子樹是否對稱:
- 當前左右值是否相同
- 當前左子樹的左子樹和右子樹的右子樹是否相同
- 當前左子樹的右子樹和右子樹的左子樹是否相同
(畫畫圖就看出來了)
利用了二叉樹的特性把
public class Solution { public boolean isSymmetric(TreeNode root) { if(root == null) return true; return isSymmetric(root.left, root.right); } public static boolean isSymmetric(TreeNode left, TreeNode right) { if(left == null && right == null) return true; if(left == null || right == null) return false; if(left.val == right.val) return isSymmetric(left.left, right.right) && isSymmetric(left.right, right.left); return false; } }