👨💻博客主页:@花无缺
欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
本文由 花无缺 原创收录于专栏 【力扣题解】
文章目录
- 【力扣题解】P101-对称二叉树-Java题解
- 🌏题目描述
- 💡题解
- 🌏总结
【力扣题解】P101-对称二叉树-Java题解
P101.对称二叉树
🌏题目描述
给你一个二叉树的根节点 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
💡题解
递归法:
public boolean isSymmetric(TreeNode root) {
return recur(root.left, root.right);
}
// 深度优先搜索, 递归法
// 递归终止条件:
// 1.两个节点都为空
// 2.仅有一个节点为空
// 3.两个节点的值不相等
public boolean recur(TreeNode L, TreeNode R) {
// 两个节点都为空
if (L == null && R == null) {
return true;
}
// 仅有一个节点为空
if (L == null || R == null) {
return false;
}
// 两个节点的值不相等
if (L.val != R.val) {
return false;
}
// 如果当前两个对应的节点是对称的, 那么递归判断这两个节点对应的左右孩子节点是否对称
return recur(L.left, R.right) && recur(L.right, R.left);
}
算法数据复杂度:O(n)
,需要遍历树的所有节点,节点数为 n。
迭代法:
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
Queue<TreeNode> queue = new LinkedList<>();
// 首先将根节点的左右孩子入队
queue.offer(root.left);
queue.offer(root.right);
while (!queue.isEmpty()) {
// 将队头两个节点出队
TreeNode l = queue.poll();
TreeNode r = queue.poll();
// 如果两个节点都为空, 判断下一对节点
if (l == null && r == null) {
continue;
}
// 如果仅有一个节点为空, 说明不是对称的
if (l == null || r == null) {
return false;
}
// 如果两节点值不相等也不对称
if (l.val != r.val) {
return false;
}
// 将左节点的左孩子和右节点的右孩子入队
// 之后进行判断
queue.offer(l.left);
queue.offer(r.right);
// 将左节点的右孩子和右节点的左孩子入队
// 之后进行判断
queue.offer(l.right);
queue.offer(r.left);
}
return true;
}
算法数据复杂度:O(n)
,需要遍历树的所有节点,节点数为 n。
🌏总结
这个题其实是对树的两个子树进行遍历,首先我们要明确一棵二叉树要满足哪些条件它会是对称二叉树:
- 左右子树为空
- 左孩子节点等于右孩子节点
- 左子树的左孩子节点等于右子树的右孩子节点,左子树的右孩子节点等于右子树的左孩子节点
根据以上三个条件我们就可以写出对应的递归算法。
同样,迭代法也是如此,对应迭代法,我们采用一个队列,首先将树的左右子树节点进队,然后对这两个节点进行以上三点判断,再将他们的左右子树对应的节点入队,如此循环,便可以判断树是否是对称的。
作者:花无缺(huawuque404.com)
🌸欢迎
关注
我的博客:花无缺-每一个不曾起舞的日子都是对生命的辜负~
🍻一起进步-刷题专栏:【力扣题解】
🥇往期精彩好文:
📢【CSS选择器全解指南】
📢【HTML万字详解】
你们的点赞👍 收藏⭐ 留言📝 关注✅
是我持续创作,输出优质内容
的最大动力!
谢谢!