目录
- 前言
- 题目
- 1.递归
- 思路
- 2. 本题思路分析:
- 3. 算法实现
- 4. pop函数的算法复杂度
- 5. 算法坑点
前言
在本科毕设结束后,我开始刷卡哥的“代码随想录”,每天一节。自己的总结笔记均会放在“算法刷题-代码随想录”该专栏下。
代码随想录此题链接
题目
给你一个二叉树的根节点 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.递归
思路
- 判断树是否对称,就是看根节点的左右孩子是否可以翻转。
递归应该是用后序遍历,因为相当于比较节点的左右孩子情况后,才能判断上一级节点是否相互对称。
2. 本题思路分析:
本题使用类似后序遍历的思想,相当于
递归三步曲,
第一步确定函数参数和返回值,因为需要比较节点的左右孩子是否可以反转,参数是左右孩子的节点类型,而返回值就是判断是否可以翻转的boolean
第二步确定终止条件,节点为空的情况三种,
if(left == null && right != null){
return false;
}else if(left != null && right == null){
return false;
}else if(left == null && right == null){
return true;
}
值是否的相同有2种
else if(left.val != right.val){
return false;
}
//以及左右孩子值相同的一种情况 这个就是需要继续下一步递归判断他们的孩子节点了
第三步,单层递归逻辑
比较左右子树的外侧是否相同,相当于比较左边节点的左孩子和右边节点的右孩子是否相同,
如果两者都相同则认为当前左右节点对称。
//单层操作 外侧比较
boolean outer = compare(left.left,right.right);
//单层操作 内侧比较
boolean inner = compare(left.right,right.left);
boolean isSame = inner && outer;
3. 算法实现
- 代码:
递归:
public boolean isSymmetric(TreeNode root) {
return compare(root.left,root.right);
}
public boolean compare(TreeNode left,TreeNode right){
//判断节点的左右孩子为空的时候
if(left == null && right != null){
return false;
}else if(left != null && right == null){
return false;
}else if(left == null && right == null){
return true;
}
//左右孩子值是否相同
else if(left.val != right.val){
return false;
}
//单层操作 外侧比较
boolean outer = compare(left.left,right.right);
//单层操作 内侧比较
boolean inner = compare(left.right,right.left);
boolean isSame = inner && outer;
return isSame;
}
4. pop函数的算法复杂度
略
5. 算法坑点
略