判断对称二叉树
难度:
标签:
题目描述
English description is not available for the problem. Please switch to Chinese.
代码结果
运行时间: 40 ms, 内存: 15.1 MB
/*
* 思路:
* 1. 若根节点为空,则树是对称的。
* 2. 使用递归和Java Stream API来比较树的左右子树是否对称。
* 3. 定义一个辅助函数isMirror,比较两棵树是否镜像。
* - 若两个节点都为空,返回true。
* - 若一个为空一个不为空,返回false。
* - 若两个节点的值相等,递归比较左节点的左子树和右节点的右子树,
* 以及左节点的右子树和右节点的左子树。
*/
import java.util.stream.Stream;
public class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) return true;
return isMirror(root.left, root.right);
}
private boolean isMirror(TreeNode left, TreeNode right) {
return Stream.of(left, right)
.allMatch(node -> node == null) ||
(left != null && right != null && left.val == right.val
&& isMirror(left.left, right.right)
&& isMirror(left.right, right.left));
}
}
解释
方法:
该题解采用递归的方法判断二叉树是否轴对称。首先,如果树为空,则认为它是对称的。对于非空树,判断其左右子树是否对称。定义一个递归函数 recur(l, r),其中 l 和 r 分别代表两个待比较的节点。该函数的逻辑如下:如果 l 和 r 都为空,则返回 True;如果其中一个为空而另一个不为空,则返回 False;否则,比较 l 和 r 的值是否相等,且递归地比较 l 的左子树和 r 的右子树是否对称,以及 l 的右子树和 r 的左子树是否对称。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在递归函数中,当两个节点值不相等时,直接返回False,但未考虑其子节点的情况。为什么可以这样做?
▷🦆
题解中提到如果树为空则认为它是对称的。这种假设是否适用于所有二叉树相关的问题,或者这是对称性特有的?
▷🦆
题解提到的递归函数recur(l, r)考虑了节点值相等并递归比较子树,但未明确说明递归停止的条件是什么。是否可以更详细地解释递归终止的条件?
▷🦆
题解中递归函数处理节点的方式是左节点的左子树对比右节点的右子树,左节点的右子树对比右节点的左子树。这种选择有没有特定的理由或是根据什么原则来的?
▷