写在前面
最近想复习一下数据结构与算法相关的内容,找一些题来做一做。如有更好思路,欢迎指正。
一、场景描述
对称二叉树。给给定一个二叉树,检查它是否是镜像对称的。
例如,二叉树 [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
二、具体步骤
1.环境说明
名称 | 说明 |
---|---|
IntelliJ IDEA | 2019.2 |
2.代码
以下为Java版本实现:
public class Lc101_IsSymmetric {
public static void main(String[] args) {
TreeNode nodeFour = new TreeNode(4);
TreeNode nodeThree = new TreeNode(3);
TreeNode nodeTwo = new TreeNode(2);
nodeTwo.left = nodeFour;
nodeTwo.right = nodeThree;
TreeNode node4 = new TreeNode(4);
TreeNode node3 = new TreeNode(3);
TreeNode node2 = new TreeNode(2);
node2.left = node3;
node2.right = node4;
TreeNode root = new TreeNode(1);
root.left = node2;
root.right = nodeTwo;
System.out.println(isSymmetric(root));
}
/**
* 思路:递归
* 返回值是boolean
*
* 将当前结点的left和right分别当作2个二叉树进行递归,比较2边的结点是否对称(思路和一个二叉树是否是另一个二叉树的子树类似)
* 2个结点的比较
*
* 判断是否镜像,比较左子树的左节点和右子树的右节点是否相同
*
* @param root
* @return
*/
private static boolean isSymmetric(TreeNode root) {
if (root == null) {
return false;
}
return isSymmetric(root.left, root.right);
}
/**
* 比较2棵子树是否对称
*
* @param t1
* @param t2
* @return
*/
private static boolean isSymmetric(TreeNode t1, TreeNode t2) {
// 循环结束条件
if (t1 == null && t2 == null) {
return true;
}
if (t1 == null || t2 == null || t1.val != t2.val) {
return false;
}
return isSymmetric(t1.left, t2.right) && isSymmetric(t1.right, t2.left);
}
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
public TreeNode(int val) {
this.val = val;
}
}
}
写在后面
如果本文内容对您有价值或者有启发的话,欢迎点赞、关注、评论和转发。您的反馈和陪伴将促进我们共同进步和成长。