https://leetcode.com/problems/symmetric-tree/
判断二叉树是否轴对称
几乎全部树的问题一定有递归解法!!!
本题中需要递归比较的是:左子树的左子树和右子树的右子树 && 左子树的右子树和右子树的左子树
public class Solution {
public boolean isSymmetric(TreeNode root) {
return root == null || partition(root.left, root.right);
}
private boolean partition(TreeNode left, TreeNode right) {
if (left == null || right == null) {
return left == right;
}
if (left.val != right.val) {
return false;
}
return partition(left.left, right.right) && partition(left.right, right.left);
}
}
非递归解法注意右子树插入的时候先插右子节点,再插左子节点,保证始终左子节点在前
public class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
List<TreeNode> left = new LinkedList();
List<TreeNode> right = new LinkedList();
left.add(root.left);
right.add(root.right);
while (left.size() != 0 && right.size() != 0) {
int size = left.size();
for (int i = 0; i < size; i++) {
TreeNode nodeLeft = left.get(0);
TreeNode nodeRight = right.get(right.size() - 1);
if (nodeLeft == nodeRight || (nodeLeft != null && nodeRight != null && nodeLeft.val == nodeRight.val)) {
left.remove(0);
if (nodeLeft != null) {
left.add(nodeLeft.left);
left.add(nodeLeft.right);
}
right.remove(right.size() - 1);
if (nodeRight != null) {
right.add(0, nodeRight.right);
right.add(0, nodeRight.left);
}
} else {
return false;
}
}
}
return left.size() == right.size();
}
}