ok,直接开始第二题。
1、题目描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/126b1992ca5f4a44aa564866b91ff38d.png)
2、逻辑分析
我们的目的是判断二叉树是否轴对称,那么我们就要知道怎么个形式它即为对称二叉树。那么接下来我们先看看题解怎么给出答案。题解给出两种方案:递归和迭代。
先来看递归:通过「同步移动」两个指针的方法来遍历这棵树,p 指针和 q 指针一开始都指向这棵树的根,随后 p 右移时,q 左移,p 左移时,q 右移。每次检查当前 p 和 q 节点的值是否相等,如果相等再判断左右子树是否对称。
3、代码演示
public boolean isSymmetric(TreeNode root) {
return check(root, root);
}
public boolean check(TreeNode p , TreeNode q){
if(p == null && q ==null ){
return true;
}
if(p == null || q == null){
return false;
}
return p.val == q.val && check(p.left, q.right) && check(p.right, q.left);
}
时间复杂度:O(n),空间复杂度:O(n)。
接下来让我们一起看看迭代的方法:首先我们引入一个队列,这是把递归程序改写成迭代程序的常用方法。
初始化时我们把根节点入队两次。每次提取两个结点并比较它们的值(队列中每两个连续的结点应该是相等的,而且它们的子树互为镜像),然后将两个结点的左右子结点按相反的顺序插入队列中。当队列为空时,或者我们检测到树不对称(即从队列中取出两个不相等的连续结点)时,该算法结束。
代码演示:
public boolean isSymmetric(TreeNode root) {
return check(root, root);
}
public boolean check(TreeNode p , TreeNode q){
Queue<TreeNode> d = new LinkedList<TreeNode>();
d.offer(p);
d.offer(q);
while(!d.isEmpty()){
p = d.poll();
q = d.poll();
if(p == null && q == null ){
continue;
}
if(p == null || q == null || (p.val != q.val)){
return false;
}
d.offer(p.left);
d.offer(q.right);
d.offer(p.right);
d.offer(q.left);
}
return true;
}
时间复杂度:O(n),空间复杂度:O(n)。
看看题解,敲敲代码。问问GPT,理解理解,感觉逻辑清晰了不少,加油呀!再见,朋友们,祝好!