对称二叉树
来源:力扣(LeetCode) 链接:leetcode.cn/problems/sy…
给你一个二叉树的根节点 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
代码
class Solution {
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return isMirror(root.left, root.right);
}
private boolean isMirror(TreeNode node1, TreeNode node2) {
if (node1 == null && node2 == null) {
return true;
}
if (node1 == null || node2 == null || node1.val != node2.val) {
return false;
}
return isMirror(node1.left, node2.right) && isMirror(node1.right, node2.left);
}
}
思路分析
-
首先,如果根节点为空,则认为是对称的,直接返回true。
-
然后,我们定义一个辅助函数isMirror,用来判断两个节点是否镜像对称。它的递归终止条件有三种情况:
- 两个节点都为空,返回true;
- 两个节点其中一个为空,另一个不为空,返回false;
- 两个节点的值不相等,返回false。
- 接下来,我们需要递归地判断左右子树是否镜像对称,即判断node1的左子树和node2的右子树是否镜像对称,以及node1的右子树和node2的左子树是否镜像对称。如果这两个条件都满足,说明整个树是镜像对称的。
平衡二叉树
来源:力扣(LeetCode) 链接:leetcode.cn/problems/ba…
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
示例 3:
输入:root = []
输出:true
提示:
- 树中的节点数在范围 [0, 5000] 内
- -104 <= Node.val <= 104
代码
class Solution {
public boolean isBalanced(TreeNode root) {
if (root == null) {
return true;
}
return height(root) != -1;
}
private int height(TreeNode node) {
if (node == null) {
return 0;
}
int leftHeight = height(node.left);
if (leftHeight == -1) {
return -1;
}
int rightHeight = height(node.right);
if (rightHeight == -1) {
return -1;
}
if (Math.abs(leftHeight - rightHeight) > 1) {
return -1;
}
return Math.max(leftHeight, rightHeight) + 1;
}
}
思路分析
-
首先,定义一个辅助函数height,用来计算二叉树的高度。如果当前节点为空,说明它的高度为0。然后递归计算左右子树的高度,并比较它们的高度差,如果超过1,则返回-1,表示当前二叉树不是平衡二叉树。
-
接下来,我们需要递归地判断每个节点的左右子树是否是平衡二叉树。如果某个节点的左右子树都是平衡二叉树,并且它们的高度差不超过1,则说明整个树是平衡二叉树。
-
最终,我们调用isBalanced函数判断根节点是否是平衡二叉树,即可得到最终的结果。