101. 对称二叉树
递归:
java
class Solution {
public boolean isSymmetric(TreeNode root) {
return check(root.left,root.right);
}
public boolean check(TreeNode u,TreeNode v){
if(u==null && v==null){
return true;
}
if(u==null || v==null || u.val != v.val){
return false;
}
return check(u.left,v.right) && check(u.right,v.left);
}
}
时间复杂度:O(N)
空间复杂度:O(N)
迭代:
java
class Solution {
public boolean isSymmetric(TreeNode root) {
return check(root, root);
}
public boolean check(TreeNode u, TreeNode v) {
Queue<TreeNode> q = new LinkedList<TreeNode>();
q.offer(u);
q.offer(v);
while (!q.isEmpty()) {
u = q.poll();
v = q.poll();
if (u == null && v == null) {
continue;
}
if ((u == null || v == null) || (u.val != v.val)) {
return false;
}
q.offer(u.left);
q.offer(v.right);
q.offer(u.right);
q.offer(v.left);
}
return true;
}
}
时间复杂度:O(N)
空间复杂度:O(N)
核心:递归是递归函数本身,迭代是通过队列存储节点,注意ArrayDeque存储不了null,要用LinkedList来存储
543. 二叉树的直径
递归:
java
//拆分问题为母问题与子问题,找联系
//求直径,其实就是求左子树最长值+右子树最长值
//左子树最长值就是左子树下一个节点的最长值+1
class Solution {
private int ans;
public int diameterOfBinaryTree(TreeNode root) {
int maxLen = simulate(root);
return ans;
}
private int simulate(TreeNode root){
if(root == null){
return -1;
}
int lLen = simulate(root.left) + 1;
int rLen = simulate(root.right) + 1;
ans = Math.max(ans,lLen+rLen);
return Math.max(lLen,rLen);
}
}
时间复杂度:O(N)
空间复杂度:O(N)