一、题目描述:
题目难度:简单
给你一个二叉树的根节点 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.题意:解释题意
A.题目要求:判断一棵树是否轴对称。
一棵树的轴对称,主要看它的左子树在翻转后,左右子树是否相等。
这涉及到翻转二叉树和判断二叉树相等的知识。
2.基本操作:题目涉及的基本操作
本题只涉及二叉树的遍历。
3.基础原理:题目涉及的算法的基本原理
A.DFS深度遍历
深度遍历是常用的二叉树算法。
B.BFS广度遍历
广度遍历同样是常用的二叉树算法,二者的结合,基本可以解决大部分二叉树问题。
分割线
三、解题思路:
思路:先翻转左子树,然后与右子树比较
A.翻转左子树
左子树的翻转方法,可以采用DFS,每一步翻转对应的左右节点,直到遇到null结点,说明翻转完毕。
代码为
private void reverse(TreeNode root){
// 节点为null,说明翻转结束
if(root==null){
return;
}
// 翻转左右子节点
TreeNode temp = root.right;
root.right = root.left;
root.left = temp;
// 翻转左右子树
reverse(root.left);
reverse(root.right);
}
B.树相等的判断
回忆前序遍历算法,我们知道:
我们优先访问根节点,然后是左子树,最后是右子树。
如果我们同时访问两棵树,一样可以采用前序遍历算法,这时,只要顺序一样,就能够保证访问的层序、节点间的关系是一致的。
层序:比如根节点在第0层,第一个左子节点在第1层,左孙节点在第2层。
节点间关系:左子节点,在右子节点的左边。
代码为:
private boolean btEqual(TreeNode tree1, TreeNode tree2){
// 都为空,说明相等【起码在这一分支上】
if(tree1==null && tree2==null){
return true;
}
// 只有一方为null,不相等
if(tree1==null || tree2==null){
return false;
}
// 如果值不同,不相等
if(tree1.val != tree2.val){
return false;
}
// 否则,返回下一层节点的判断结果
return btEqual(tree1.left, tree2.left) && btEqual(tree1.right, tree2.right);
}
分割线
四、解题难点分析:
无。
分割线
五、代码:
class Solution {
public boolean isSymmetric(TreeNode root) {
TreeNode left = root.left;
TreeNode right = root.right;
// 翻转左子树
reverse(left);
return btEqual(left, right);
}
// 判断两棵树相等否
private boolean btEqual(TreeNode tree1, TreeNode tree2){
if(tree1==null && tree2==null){
return true;
}
if(tree1==null || tree2==null){
return false;
}
if(tree1.val != tree2.val){
return false;
}
return btEqual(tree1.left, tree2.left) && btEqual(tree1.right, tree2.right);
}
// 翻转树的函数
private void reverse(TreeNode root){
if(root==null){
return;
}
TreeNode temp = root.right;
root.right = root.left;
root.left = temp;
reverse(root.left);
reverse(root.right);
}
}
分割线
六、结语:
以上内容即我想分享的关于力扣热题27的一些知识。
我是蚊子码农,如有补充,欢迎在评论区留言。个人也是初学者,知识体系可能没有那么完善,希望各位多多指正,谢谢大家。