【每日算法】LeetCode 101 —— 对称二叉树(一百九十三)

题目内容

给定一个二叉树,检查它是否是镜像对称的。请用递归和迭代两种方法解决这个问题。

示例

示例一

二叉树 [1,2,2,3,4,4,3] 是对称的。

示例二

[1,2,2,null,3,null,3] 则不是镜像对称的。

题解

本题的思路很简单,就是对树进行遍历求解。只需要注意:在遍历的过程中,要对称遍历,即在遍历左子树的左儿子时对应地要遍历右子树的右儿子即可。

代码

//递归写法
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null) return true;
return dfs(root.left,root.right);
}

public boolean dfs(TreeNode p,TreeNode q){
if(p == null && q == null) return true;
if(p==null || q== null || p.val != q.val) return false;
return dfs(p.left,q.right) && dfs(p.right,q.left);
}
}
//迭代写法
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null || (root.left==null && root.right==null)) {
return true;
}
//用队列保存节点
LinkedList<TreeNode> queue = new LinkedList<TreeNode>();
//将根节点的左右孩子放到队列中
queue.add(root.left);
queue.add(root.right);
while(queue.size()>0) {
//从队列中取出两个节点,再比较这两个节点
TreeNode left = queue.removeFirst();
TreeNode right = queue.removeFirst();
//如果两个节点都为空就继续循环,两者有一个为空就返回false
if(left==null && right==null) {
continue;
}
if(left==null || right==null) {
return false;
}
if(left.val!=right.val) {
return false;
}
//将左节点的左孩子, 右节点的右孩子放入队列
queue.add(left.left);
queue.add(right.right);
//将左节点的右孩子,右节点的左孩子放入队列
queue.add(left.right);
queue.add(right.left);
}

return true;
}
}
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/07/16/【每日算法】LeetCode-101-——-对称二叉树(一百九十三)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号