剑指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