题目地址(101. 对称二叉树)
https://leetcode-cn.com/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进阶:你可以运用递归和迭代两种方法解决这个问题吗?
前置知识
公司
- 暂无
思路
要比较外侧和内侧节点的不同 需要判断节点为空或者不为空的情况
节点为空的情况有
- 左节点为空,右节点不为空,不对称,return false
- 左不为空,右为空,不对称 return false
- 左右都为空,对称,返回true
把这些都排除了 就只剩下不为空的了 然后再判断量变数字是否相等 就o了
关键点
代码
- 语言支持:Java
Java Code:
递归法
/*** 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) {return compare(root.left, root.right);}public boolean compare(TreeNode left , TreeNode right){//比较节点是否对称 情况1 左空右不空if (left == null && right != null) {return false;}//情况2 左不空右空if (left != null && right == null) {return false;}//情况3 左右都空if (left == null && right == null) {return true;}//比较值是否不相等 这里判断完之后就只剩下相等的情况了if (left.val != right.val) {return false;}//比较外层boolean leftT = compare(left.left, right.right);//比较内层boolean leftR = compare(left.right, right.left);return leftT && leftR;}}
迭代法:
class Solution {public boolean isSymmetric(TreeNode root) {Queue<TreeNode> queue = new LinkedList<>();queue.offer(root.left);queue.offer(root.right);while (!queue.isEmpty()) {TreeNode left = queue.poll();TreeNode right = queue.poll();if (left == null && right == null) {continue;}if (left == null || right == null || left.val != right.val) {return false;}queue.offer(left.left);queue.offer(right.right);queue.offer(left.right);queue.offer(right.left);}return true;}}
复杂度分析
令 n 为数组长度。
- 时间复杂度:
#card=math&code=O%28n%29&id=UVPcG)
- 空间复杂度:
#card=math&code=O%28n%29&id=KCpTT)
