var isSymmetric = function(root) {
if(!root) return true;
return isMirror(root.left, root.right);
};
function isMirror(left, right) {
if(!left && !right) return true;
if(!left || !right) return false;
if(left.val !== right.val) return false;
// 判断左右子树是否对称 (左子树的左节点和右子树的右节点, 左子树的右节点和右子树的左节点)
return isMirror(left.right, right.left) && isMirror(left.left, right.right);
}
针对你提供的 isSymmetric
函数,可以从代码可读性和性能两个方面进行优化。以下是具体的优化建议:
1. 提升代码可读性
- 函数命名:
isMirror
函数可以更明确地命名为isSymmetricTrees
,以更好地表达其功能。 - 注释优化:现有的注释可以更加简洁明了,避免冗余。
2. 性能优化
- 递归深度优化:当前的递归方式在处理大型树时可能会导致栈溢出。可以通过迭代的方式使用队列或栈来实现对称性检查,减少递归深度。
- 提前返回:在比较节点值时,如果发现不对称可以直接返回
false
,避免不必要的递归调用。
优化后的代码示例
var isSymmetric = function(root) {
if (!root) return true;
return isSymmetricTrees(root.left, root.right);
};
function isSymmetricTrees(left, right) {
const queue = [];
queue.push(left);
queue.push(right);
while (queue.length > 0) {
left = queue.shift();
right = queue.shift();
if (!left && !right) continue;
if (!left || !right) return false;
if (left.val !== right.val) return false;
queue.push(left.left);
queue.push(right.right);
queue.push(left.right);
queue.push(right.left);
}
return true;
}
3. 迭代版本的优势
- 避免递归深度过大:通过使用队列进行广度优先搜索(BFS),可以有效避免递归深度过大的问题。
- 提高性能:迭代版本在处理大规模数据时通常比递归版本更快,因为减少了函数调用的开销。