Appearance
0101-对称二叉树
https://leetcode.cn/problems/symmetric-tree 给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树[1,2,2,3,4,4,3] 是对称的。
1
/ \
2 2
/ \ / \
3 4 4 3
但是下面这个[1,2,2,null,3,null,3] 则不是镜像对称的:
1
/ \
2 2
\ \
3 3
进阶: 你可以运用递归和迭代两种方法解决这个问题吗?
思路
对称二叉树,分别检查左节点和右节点是不是对称
参考代码
csharp
public class Solution {
private bool IsSymmetricTree(TreeNode left, TreeNode right){
//如果有一个节点为null,判断他们是否都为 null
if(left == null || right == null){
return left == right;
}
//判断值是否相等
if(left.val != right.val){
return false;
}
return IsSymmetricTree(left.left,right.right) && IsSymmetricTree(left.right,right.left);
}
public bool IsSymmetric(TreeNode root) {
if(root == null){
return true;
}
return IsSymmetricTree(root.left,root.right);
}
}
参考代码:复习 20220504
要把两个节点拆开判断是否对称
csharp
public class Solution {
public bool IsSymmetric(TreeNode left, TreeNode right){
if(left == null || right == null){
return left == right;
}
if(left.val != right.val){
return false;
}
return IsSymmetric(left.left, right.right) && IsSymmetric(left.right, right.left);
}
public bool IsSymmetric(TreeNode root) {
if(root == null){
return true;
}
return IsSymmetric(root.left, root.right);
}
}
思路:迭代方法
将两个子树分别按照对称方式加入queue
csharp
public class Solution {
public bool IsSymmetric(TreeNode root) {
//测试,使用队列把两个子树按照对称方式加入
if(root == null){
return true;
}
Queue<TreeNode> q1 = new Queue<TreeNode>();
Queue<TreeNode> q2 = new Queue<TreeNode>();
q1.Enqueue(root.left);
q2.Enqueue(root.right);
while(q1.Count > 0 && q2.Count > 0){
TreeNode node1 = q1.Dequeue();
TreeNode node2 = q2.Dequeue();
if(node1 == null || node2 == null){
if(node1 != node2){
return false;
}
continue;
}
if(node1.val != node2.val){
return false;
}
//对称加入节点
q1.Enqueue(node1.left);
q1.Enqueue(node1.right);
q2.Enqueue(node2.right);
q2.Enqueue(node2.left);
}
return true;
}
}
AlgoPress