对称二叉树
题目描述
给你一个二叉树的根节点 root , 检查它是否轴对称。
示例 1:

输入:root = [1,2,2,3,4,4,3]
输出:true
示例 2:

输入:root = [1,2,2,null,3,null,3]
输出:false
提示:
树中节点数目在范围 [1, 1000] 内
-100 <= Node.val <= 100
进阶:你可以运用递归和迭代两种方法解决这个问题吗?
求解
(1)递归
使用两个指针p,q,一开始指向 根节点,分别进行遍历,分别判断当前节点是否相等、 左子树的左节点是否和右子树的右节点相等 以及 左子树的右节点 是否与 右子树的左节点相等。
js
var check = function(p, q) {
if (!p && !q) return true;
if (!p || !q) return false;
return p.val === q.val && check(p.left, q.right) && check(p.right, q.left);
}
var isSymmetric = function(root) {
// 递归,使用两个指针,遍历树
// 一开始都指向 根节点
if (!root) return true;
return check(root.left, root.right);
};
(2)迭代
层序遍历,把null也放进去判断。我自己手搓的 有点 冗余了。
js
var isSymmetric = function(root) {
// 层序遍历
if (!root) return true;
let queue = [];
queue.push(root);
while(queue.length !== 0) {
let temp = [];
for (let node of queue) {
if (node) {
temp.push(node.left);
temp.push(node.right);
}
}
for (let i = 0; i < temp.length / 2; i++) {
let p = temp[i], q = temp[temp.length - i - 1];
if (p && q) {
if (p.val !== q.val) return false;
} else if (!p && !q) {
continue;
} else {
return false;
}
}
queue = temp;
}
return true;
};
改进:可在遍历当前层时直接处理对称位置;代码:
js
var isSymmetric = function(root) {
if (!root) return true;
let queue = [root.left, root.right];
while (queue.length !== 0) {
let p = queue.shift();
let q = queue.shift();
if (!p && !q) continue;
if (!p || !q || p.val !== q.val) return false
queue.push(p.left, q.right);
queue.push(p.right, q.left);
}
return true;
};
二叉树的直径
题目描述
给你一棵二叉树的根节点,返回该树的 直径 。
二叉树的 直径 是指树中任意两个节点之间最长路径的 长度 。这条路径可能经过也可能不经过根节点 root 。
两节点之间路径的 长度 由它们之间边数表示。
示例 1:
输入:root = [1,2,3,4,5]
输出:3
解释:3 ,取路径 [4,2,1,3] 或 [5,2,1,3] 的长度。
示例 2:
输入:root = [1,2]
输出:1
提示:
树中节点数目在范围 [1, 104] 内
-100 <= Node.val <= 100
求解

一开始的想法就是 考虑根节点 左右两边子树的 深度,但是可能答案也会出现在子树上。
js
var getLength = function(root) {
if (!root) return 0;
return Math.max(getLength(root.left), getLength(root.right)) + 1
}
var diameterOfBinaryTree = function(root) {
if (!root) return 0;
let leftMax = getLength(root.left);
let rightMax = getLength(root.right);
return leftMax + rightMax;
};
上面这个代码有误,当答案出现在子树上就会解答错误。
正确代码:
js
var diameterOfBinaryTree = function(root) {
if (!root) return 0;
let max = 0;
const getLength = (root) => {
if (!root) return 0;
let leftMax = getLength(root.left);
let rightMax = getLength(root.right);
max = Math.max(max, leftMax + rightMax)
return Math.max(leftMax, rightMax) + 1
}
getLength(root);
return max;
};