劍指Offer題目:對稱的二叉樹
題目描述
請實現一個函數,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的鏡像是同樣的,定義其爲對稱的。
解題思路
思路:
(1) 遞歸。根結點的左右子結點值相同,同時左子結點的左子結點和右子結點的右子結點值相同,左子結點的右子結點和右子結點的左子結點值相同即可。
(2)也可以採用非遞歸思路,利用隊列或者棧實現。
完整代碼
public class q59_isSymmetrical_對稱的二叉樹 {
//遞歸方法
boolean isSymmetrical1(TreeNode pRoot) {
if (pRoot == null) return true;
return isSym(pRoot.left, pRoot.right);
}
private boolean isSym(TreeNode left, TreeNode right) {
if (left == null && right == null) return true;
if (left == null || right == null) return false;
if (left.val != right.val) return false;
return isSym(left.right, right.left) && isSym(left.left, right.right);
}
//非遞歸方法
boolean isSymmetrical2(TreeNode pRoot) {
{
if (pRoot == null) return true;
LinkedList<TreeNode> queue = new LinkedList();
queue.offer(pRoot.left);
queue.offer(pRoot.right);
while (queue.size() != 0) {
TreeNode left = queue.poll();
TreeNode right = queue.poll();
if (left == null && right != null) return false;
if (left != null && right == null) return false;
if (left != null && right != null) {
if (left.val != right.val) return false;
queue.offer(left.left);
queue.offer(right.right);
queue.offer(left.right);
queue.offer(right.left);
}
}
return true;
}
}
}
更多LeetCode題目及答案解析見GitHub: https://github.com/on-the-roads/LeetCode
劍指offer題目及答案解析:https://github.com/on-the-roads/SwordToOffer