题解 | #对称的二叉树#
对称的二叉树
https://www.nowcoder.com/practice/ff05d44dfdb04e1d83bdbdab320efbcb
package com.iwen.Sword1;
import com.iwen.小码哥第三季.common.TreeNode;
import java.util.LinkedList;
/**
* @ClassName 对称的二叉树
* @Description TODO
* @Author iwen
* @Date 2023/6/12 14:19
* @Version 1.0
**/
public class 对称的二叉树 {
/**
* 给定一棵二叉树,判断其是否是自身的镜像(即:是否对称)
* 方式一:递归,主要是使⽤递归,先判断根节点是否为空,不为空则判断左右⼦树是不是对称。
* 如果左右⼦树都为空,则返回true,如果有⼀个为空,则返回false,如果两个都不为空的时候,除了对⽐左右两个节点的值,还需要递归,
* 对⽐左⼦树的左⼦树和右⼦树的右⼦树是否相等,左⼦树的右⼦树和右⼦树的左⼦树是否相等。
*
* 方式二:另外⼀种,⾮递归的做法,是借助两个队列,按照层次,⼀个是按照从左到右添加元素,另外⼀个队列是按照从右到左添加元素,挨个取出来,进⾏对⽐,
* 不等则说明不对称,如果相等,则再把其左右⼦树分别按照不同的顺序添加到队列中。
* */
public boolean isSymmetrical(TreeNode pRoot) {
// 判断根节点是否为空,如果不为空则判断左右⼦树
return pRoot==null || jude(pRoot.left, pRoot.right);
}
boolean jude(TreeNode left, TreeNode right) {
// 如果左右两个都为空,则对称
if (left == null && right == null) {
return true;
} else if (left == null || right == null) {
// 如果左右两个有⼀个为空,那么就不对称
return false;
}
// 都不为空的情况,需要判断两个的值,是不是相等
if (left.val != right.val) {
return false;
} else {
// 递归判断,左⼦树的左⼦树和右⼦树的右⼦树,左⼦树的右⼦树和右⼦树的左⼦树
return jude(left.left, right.right) && jude(left.right,right.left);
}
}
boolean isSymmetrical2(TreeNode pRoot){
if (pRoot == null) return true;
LinkedList<TreeNode> leftNodes = new LinkedList<>();
LinkedList<TreeNode> rightNodes = new LinkedList<>();
leftNodes.add(pRoot.left);
rightNodes.add(pRoot.right);
while (!leftNodes.isEmpty() && !rightNodes.isEmpty()) {
TreeNode leftNode = leftNodes.poll();
TreeNode rightNode = rightNodes.poll();
if (leftNode == null && rightNode == null)
continue;
if (leftNode == null || rightNode == null)
return false;
// 取出来对⽐
if (leftNode.val != rightNode.val)
return false;
// 从左往右添加节点
leftNodes.add(leftNode.left);
leftNodes.add(leftNode.right);
// 从右往左添加节点
rightNodes.add(rightNode.right);
rightNodes.add(rightNode.left);
}
return leftNodes.isEmpty() && rightNodes.isEmpty();
}
}
解题思想:
方式一:递归
方式二:借助队列
#算法##算法笔记#
