非商業,LeetCode連接附上:java
https://leetcode-cn.com/problems/symmetric-tree/this
進入正題。spa
題目:.net
給定一個二叉樹,檢查它是不是鏡像對稱的。code
示例:blog
例如,二叉樹 [1,2,2,3,4,4,3] 是對稱的。遞歸
1 / \ 2 2 / \ / \ 3 4 4 3
可是下面這個 [1,2,2,null,3,null,3] 則不是鏡像對稱的:leetcode
1 / \ 2 2 \ \ 3 3
進階:get
你能夠運用遞歸和迭代兩種方法解決這個問題嗎?同步
代碼實現:
//節點 class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; } } //方法一 遞歸 class Solution { public boolean isSymmetric(TreeNode root) { return check(root, root); } private boolean check(TreeNode p, TreeNode q) { if(p == null && q == null) { return true; } if(p == null || q == null) { return false; } return p.val == q.val && check(p.left, q.right) && check(p.right, q.left); } } //時間複雜度O(n),空間複雜度O(n) //方法二 迭代 class Solution { public boolean isSymmetric(TreeNode root) { if(root == null) { return true; } return check(root.left, root.right); } private boolean check(TreeNode p, TreeNode q) { Queue<TreeNode> queue = new LinkedList<>(); queue.offer(p); queue.offer(q); while (!queue.isEmpty()) { p = queue.poll(); q = queue.poll(); if(p == null && q == null) { continue; } if((p == null) || (q == null) || (p.val != q.val)) { return false; } queue.offer(p.left); queue.offer(q.right); queue.offer(p.right); queue.offer(q.left); } return true; } } //時間複雜度O(n),空間複雜度O(n)
分析:
題目中針對「對稱二叉樹」,要先找出「對稱二叉樹」的特色;
針對對稱二叉樹的特色進行遞歸的終止條件設置以及迭代時節點的存取及比較方式。
--End
本文同步分享在 博客"黑冰臺"(CNBlog)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。