来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/symmetric-tree/
题目描述
给定一个二叉树的根节点,检查是否轴对称。
题目分析
若一个树的左右子树镜像对称,那么这个二叉树就是对称的。
那么左右两个树什么情况下互为镜像?
- 它们的两个根结点具有相同的值
- 每个树的右子树都与另一个树的左子树镜像对称
因而,可考虑用递归实现。
代码实现
public class DuiCheng101 {
/**
* 迭代算法
* 队列中添加 对称的两个节点,判断是否一致
*
* @param root
* @return
*/
public boolean isSymmetric2(TreeNode root) {
if (root == null) {
return true;
}
TreeNode left = root.left;
TreeNode right = root.right;
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(left);
queue.offer(right);
while (!queue.isEmpty()) {
left = queue.poll();
right = queue.poll();
if (left == null && right == null) {
continue;
}
if (left == null || right == null) {
return false;
}
if (left.val != right.val) {
return false;
}
queue.offer(left.left);
queue.offer(right.right);
queue.offer(left.right);
queue.offer(right.left);
}
return true;
}
/**
* 【递归】
* 比较左右两棵树
*
* @param root
* @return
*/
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
return check(root.left, root.right);
}
private boolean check(TreeNode p, TreeNode q) {
if (p == null && q == null) {
return true;
}
if (p == null && q != null) {
return false;
}
if (p != null && q == null) {
return false;
}
if (p.val != q.val) {
return false;
}
return check(p.left, q.right) && check(p.right, q.left);
}
}
复杂度
- 时间复杂度:O(n),因为遍历了整棵树,因而渐进时间复杂度为O(n)
- 空间复杂度:递归层数不超过n,因而渐进空间复杂度为O(n)
好了,今天就到这里,感谢各位看官到这里,不如点个关注吧!