算法-递归-对称二叉树
1 题目概述
1.1 题目出处
https://leetcode-cn.com/problems/symmetric-tree/
1.2 题目描述
2.1 双指针+递归
2.1 解题思路
- 根据对称树的特点,我们用两个指针分别往左子节点和右子节点递归查询
- 每次查询时比较他们是否都为空,
- 如果都不为空就比较是否值相等
- 如果值相等,就继续检查左节点的左节点和右节点的右节点、左节点的右节点和右节点的左节点
- 只要都相同就说明对称,否则不对称
2.2 代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null){
return true;
}
return check(root.left, root.right);
}
private boolean check(TreeNode left, TreeNode right){
if(left == null){
return right == null;
}
if(right == null){
return left == null;
}
return left.val == right.val && check(left.left, right.right) && check(left.right, right.left);
}
}
2.3 时间复杂度
O(N)
2.4 空间复杂度
O(N)
3 迭代+BFS
3.1 解题思路
- 我们使用一个队列,根据对称树的特点,每次分别将左子节点和右子节点放入队列完成初始化
- 每次从队列中取出两个元素作对比,
- 对比时,分别判断空值、不为空值时各种情况
- 如果发现不等,直接返回;否则继续按左节点的左节点、右节点的右节点、左节点的右节点、右节点的左节点的顺序加入到Queue中
3.2 代码
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root == null){
return true;
}
// return check(root.left, root.right);
return check2(root);
}
private boolean check2(TreeNode root){
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root.left);
queue.add(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.add(left.left);
queue.add(right.right);
queue.add(left.right);
queue.add(right.left);
}
return true;
}
}
3.3 时间复杂度
O(N)
3.4 空间复杂度
O(N)