二叉树的相关题目的实现通常都是使用递归,思路清晰容易理解
public class Solution {
boolean isSymmetrical(TreeNode pRoot){
if(pRoot == null)
return true;
return isSymmetrical(pRoot.left, pRoot.right);
}
boolean isSymmetrical(TreeNode left, TreeNode right) {
if(left == right)
return true;
if(left == null || right == null)
return false;
if(left.val != right.val)
return false;
return isSymmetrical(left.left, right.right) &&
isSymmetrical(left.right, right.left);
}
}
当然非递归的写法效率上会好一点,思路就是使用一个双端队列每次检查两个节点的左右子节点是否存在,若都存在放入队列进行比较,依次类推
public class Solution {
boolean isSymmetrical(TreeNode pRoot) {
if(pRoot == null) {
return true;
}
if(pRoot.left == null && pRoot.right == null) {
return true;
}
if(pRoot.left == null || pRoot.right == null)
return false;
LinkedList<TreeNode> deque = new LinkedList<>();
deque.offerFirst(pRoot.left);
deque.offerLast(pRoot.right);
while(!deque.isEmpty()) {
TreeNode head = deque.pollFirst();
TreeNode tail = deque.pollLast();
if(head.val != tail.val)
return false;
if((head.left == null && tail.right != null) || (head.left != null && tail.right == null))
return false;
if(head.left != null) {
deque.offerFirst(head.left);
deque.offerLast(tail.right);
}
if((head.right == null && tail.left != null) || (head.right != null && tail.left == null))
return false;
if(head.right != null) {
deque.offerFirst(head.right);
deque.offerLast(tail.left);
}
}
return true;
}
}