题目: 对称二叉树
我使用的的是非递归解法,所以相对于递归解法来说代码量会比较多且时空性能比较低 --------但是这也是一个思路
思路非常简单:我们可以从上到下比较每一层的左半部分结点与右半部分结点是否镜像相同即可,(最左与最右比,次左与次右比较…以此类推)
public class Solution {
public boolean isSymmetric(TreeNode root) {
Queue<TreeNode> queue = new LinkedList<>();
ArrayList<TreeNode> inside = new ArrayList<>();
queue.add(root);
while (queue.size() > 0){
while (queue.size() > 0)
{
inside.add(queue.poll());
}
if (inside.size() > 0){
int midIndex = inside.size() / 2;
for (int i = 0; i < midIndex; i++) {
if (inside.get(i) == null && inside.get(inside.size() - i - 1) == null){
}else if ((inside.get(i) != null && inside.get(inside.size() - i - 1) != null) && inside.get(i).val == inside.get(inside.size() - i - 1).val){
}else {
return false;
}
}
for (TreeNode treeNode : inside) {
if (treeNode!= null && treeNode.left != null){
queue.add(treeNode.left);
}else if (treeNode!= null && treeNode.left == null){
queue.add(null);
}
if (treeNode!= null && treeNode.right != null){
queue.add(treeNode.right);
}else if (treeNode!= null && treeNode.right == null){
queue.add(null);
}
}
inside.clear();
}
}
return true;
}
}
递归解法(借用的是LeetCode评论的zengfalifly用户的代码):
递归也很好理解:
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null) return true;
return isSymmertric(root.left, root.right);
}
private boolean isSymmertric(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;
return isSymmertric(t1.left, t2.right) && isSymmertric(t1.right, t2.left);
}
}