class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
if root is None:
return True
return self.check(root.left, root.right)
def check(self, left: TreeNode, right: TreeNode) -> bool:
if left is None and right is None:
return True
if left is None or right is None or left.val != right.val:
return False
return self.check(left.left, right.right) and self.check(left.right, right.left)
递归
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
lst1 = []
lst2 = []
def isSymmetric(self, root: TreeNode) -> bool:
if not root:
return True
if not root.left and not root.right:
return True
return self.isMirror(root.left, root.right)
def isMirror(self, left, right):
if not left and not right:
return True
if (not left and right) or (left and not right):
return False
if left.val != right.val:
return False
return self.isMirror(left.left, right.right) and self.isMirror(left.right, right.left)
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def isSymmetric(self, root: Optional[TreeNode]) -> bool:
def isSymmetricHelepr(left, right):
if not left and not right:
return True
elif not left or not right:
return False
else:
return left.val == right.val and isSymmetricHelepr(left.right, right.left) and isSymmetricHelepr(left.left, right.right)
return isSymmetricHelepr(root.left, root.right)
#使用helper
共以下 47 个回答
“`java queue = new LinkedList<>();
关键在于要判断好最左和最右和内左内右对称
class Solution {
public boolean checkSymmetricTree(TreeNode root) {
if (root == null) {
return true;
}
return check(root.left, root.right);
}
public boolean check(TreeNode p, TreeNode q) {
Queue
queue.offer(p);
queue.offer(q);
while (!queue.isEmpty()) {
TreeNode m = queue.poll();
TreeNode n = queue.poll();
if (m == null && n == null) {
continue;
}
if (m == null || n == null || m.val != n.val) {
return false;
}
queue.offer(m.right);
queue.offer(n.left);
queue.offer(m.left);
queue.offer(n.right);
}
return true;
}
}
[TOC]
思路
解题方法
复杂度
o(n)
– 时间复杂度:
> 树的高度
Code
“`C++ []
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
bool isSymmetric(TreeNode root) {
if(root nullptr) return true;
if(root->left nullptr && root->right nullptr) return true;
return f(root->left,root->right);
public:
bool f(TreeNode* A,TreeNode* B){
if(Anullptr && Bnullptr) return true;
if(A nullptr || B nullptr) return false;
if(A->val != B->val) return false;
};
“`
/**
* 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(rootnull){
return true;
}
return same(root.right,root.left);
}
public boolean same(TreeNode a,TreeNode b){
if(anull&&bnull){return true;}
if(anull||bnull){return false;}
if(a.val!=b.val){return false;}
return same(a.right,b.left)&&same(a.left,b.right);
}
}
对称二叉树递归比较左节点和右节点,。
“`java
public boolean isSymmetric (TreeNode root){
return root ==null?true:isSymmetric(root.left,root.right);
}
public boolean isSymmetric(TreeNode left,TreeNode right){
//一个节点,左右都为空,那么就是对称
if(left == null &&right == null)||(right.val!= left.val)){
return false;
}
//镜像对比
return isSymmetric(left.left,right.right)&&isSymmetric(left.right,right.left);
}
时间复杂度0(n) 空间复杂度0(n)
思路:判断左右子树是否是否互相为镜像二叉树
思路:这里有一个思考为什么在 f函数中 val相等时不返回 true,因为当递归到最后一个空结点时,其值就为true,会一直向上传递
时间复杂度O(n),空间复杂度O(n)
【思路】递归思路,根结点的左右子树应该互为镜像,左子树的左子树与右子树的右子树又互为镜像,以此类推完成递归。之前有考虑过用广度优先遍历的方法,但该方法需要使用栈/队列之类的辅助数据结构,因此空间复杂度会更高O(logn)。
【复杂度】时间复杂度O(n),空间复杂度O(1)
C++实现
这段代码中,定义了一个 Solution 类,其中包含了一个 isSymmetric 函数,用于判断二叉树是否对称。函数接收一个二叉树的根节点作为参数,返回一个布尔值,表示二叉树是否对称。
在 isSymmetric 函数中,首先判断根节点是否为空。如果为空,则直接返回 True ,因为空树被认为是对称的。
如果根节点不为空,则调用 checkSymmetry 函数来判断左右子树是否对称。 checkSymmetry 函数接收左右子树的根节点作为参数,返回一个布尔值,表示左右子树是否对称。
在 checkSymmetry 函数中,有以下几种情况需要考虑:
– 如果左右子树的根节点都为空,说明当前节点是叶子节点,对称性成立,返回 True 。
– 如果左右子树的根节点只有一个为空,说明左右子树结构不对称,返回 False 。
– 如果左右子树的根节点的值不相等,说明左右子树的节点值不对称,返回 False 。
– 否则,递归地判断左子树的左节点和右子树的右节点是否对称,以及左子树的右节点和右子树的左节点是否对称。如果都对称,则返回 True ,否则返回 False 。
通过递归地判断二叉树的左右子树是否对称,从而判断整个二叉树是否对称。
递归
【时间O(n),空间O(1)】
递归
时间和空间复杂度都是O(N)
思路:采用辅助函数,同时传入左右子树,以此查看是否对称
时间复杂度O(n) 空间复杂度O(n)
public boolean isSymmetric(TreeNode root) {
if(root null || (root.left null && root.right null)){
return true;
}
return f(root.left,root.right);
}
public boolean f(TreeNode l, TreeNode r){
if(l null && r null) return true;
if(l null || r null) return false;
if(l.val != r.val) return false;
return f(l.left,r.right)&&f(l.right,r.left);
}
时间复杂度:o(n)
空间复杂度:o(n)
时间复杂度为O(n)
空间复杂度为O(n)
递归
时间:O(n)
空间:O(n)
可以
class Solution {
public:
bool isSymmetric(TreeNode* root) {
if(rootnullptr){
return true;
}
return isMirror(root->left, root->right);
}
bool isMirror(TreeNode* left, TreeNode* right){
if(leftnullptr&&rightnullptr){
return true;
}
if(leftnullptr||rightnullptr||left->val!=right->val){
return false;
}
return isMirror(left->left, right->right)&&isMirror(left->right, right->left);
}
};
时间复杂度O(n)
空间复杂度O(n)
时间复杂度O(n)
空间复杂度O(n)
时间复杂度O(N)
空间复杂度O(N)
时间复杂度 O(N)
空间复杂度 O(N)
一开始不会,看完讲解会了
时间复杂度:O(N)
空间复杂度:O(N)
c++递归
bool compare(TreeNode* left,TreeNode* right)
{
if(leftNULL&&rightNULL)return true;
else if(leftNULL&&right!=NULL)return false;
else if(left!=NULL&&rightNULL)return false;
else if(left->val!=right->val)return false;
bool outside = compare(left->left,right->right);
bool inside = compare(left->right,right->left);
return outside&&inside;
}
bool isSymmetric(TreeNode* root) {
if(rootNULL)return true;
return compare(root->left,root->right);
}
这个有点想复杂了 都是O(n)
递归
判断两节点 l.left 和 r.right是否对称
判断两节点 l.right 和 r.left是否对称
不对称就改全局变量isSymmetric为false并退出
复杂度
时间复杂度: $O(n)$
空间复杂度: $O(n)$
Code
时空复杂度:O(n)
1、递归分析
2、新建方法f返回左右子树是否为镜像二叉树
3、f中判断如果两个结点A、B数值相同,继续递归判断A的左子树和B的右子树是否相等
时间复杂度:O(n)
空间复杂度:O(n)
自己没想出来哇哇哇
时间复杂度O(n) 空间复杂度:树的高度
一个节点左根右深度遍历,一个节点右根左深度遍历,不断比较这两个节点即可
为了防止重复遍历,即整棵树的根节点左边和右边比较一次,右边和左边比较一次。当这两个点都遍历到根节点时,停止
时间复杂度O(n) 空间复杂度 O(h)
思路
代码
无
C++实现
时间复杂度:O(n)
空间复杂度:树的高度
时间复杂度和空间复杂度都是O(n)。
复杂度O(n) O(height)
复杂度O(n) O(n)
class Solution {
public boolean isSymmetric(TreeNode root) {
if(root null || (root.left null && root.right null)){
return true;
}
}
时间复杂度:O(n)
空间复杂度:树的高度