# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution(object):
def check(self, L, R):
if not L and not R:
return True
if not L or not R or L.val != R.val:
return False
return self.check(L.left, R.right) and self.check(L.right, R.left)
def checkSymmetricTree(self, root):
"""
:type root: Optional[TreeNode]
:rtype: bool
"""
if not root or (not root.left and not root.right):
return True
return self.check(root.left, root.right)
class Solution:
def checkSymmetricTree(self, root: Optional[TreeNode]) -> bool:
if not root:
return True
def recur(L,R):
if not L and not R:return True
if not L or not R or L.val != R.val:
return False
return recur(L.right,R.left) and recur(L.left,R.right)
共以下 31 个回答
第n次打卡
class Solution {
public boolean checkSymmetricTree(TreeNode root) {
return root null || recur(root.left, root .right);
}
public boolean recur(TreeNode L, TreeNode R){
if(L null && R null)return true;
if(L null || R null || L.val != R.val) return false;
return recur(L.left, R.right) && recur(L.right, R.left);
}
}时间空间复杂度O(n)
day7第二题
/**
* 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 checkSymmetricTree(TreeNode root) {
if(root null) return true;
}
时空复杂度O(n)
java
class Solution{
public boolean checkSymmetricTree(TreeNode root){
return check(root, root);
}
}
提交
class Solution {
public:
};
打卡
代码;
class Solution {
public boolean checkSymmetricTree(TreeNode root) {
if((rootnull)||((root.leftnull)&&(root.rightnull)))
return true;
return check(root.left,root.right);
}
public boolean check(TreeNode left,TreeNode right)
{
if(leftnull&&rightnull)
return true;
if(leftnull||rightnull)
return false;
if(left.val!=right.val)
return false;
return check(left.left,right.right)&&check(left.right,right.left);
}
}
递归判断下去,左子树的左子树和右子树的右子树是否相同,左子树的右子树和右子树的左子树是否相同
时间空间复杂度均为$O(n)$
时间复杂度,空间复杂度都为O(n)
时间复杂度:O(n)
空间复杂度:树的高度
class Solution {
public boolean checkSymmetricTree(TreeNode root) {
return check(root, root);
}
public boolean check(TreeNode left, TreeNode right){
if(left null && right null)return true;
if(left null || right null)return false;
return left.val right.val & check(left.left, right.right) & check(left.right, right.left);// 递归判断
}
}
class Solution {
public:
bool checkSymmetricTree(TreeNode* root) {
if(root nullptr||root->left nullptr &&root->right nullptr) return true;
};
广度遍历,判断每一层数据是否轴对称
时间复杂度O(N),空间复杂度O(N)
class Solution {
public boolean checkSymmetricTree(TreeNode root) {
return root null || recur(root.left, root.right);
}
boolean recur(TreeNode L, TreeNode R) {
if(L null && R null) return true;
if(L null || R null || L.val != R.val) return false;
return recur(L.left, R.right) && recur(L.right, R.left);
}
}
思路:
checkSymmetricTree(root) :
若根节点 root 为空,则直接返回 true 。
返回值: 即 recur(root.left, root.right) ;
recur(L, R) :
终止条件:
当 L 和 R 同时越过叶节点: 此树从顶至底的节点都对称,因此返回 true ;
当 L 或 R 中只有一个越过叶节点: 此树不对称,因此返回 false;
当节点 L 值 ≠= 节点 R 值: 此树不对称,因此返回 false ;
递推工作:
判断两节点 L.left 和 R.right 是否对称,即 recur(L.left, R.right) ;
判断两节点 L.right 和 R.left 是否对称,即 recur(L.right, R.left) ;
返回值: 两对节点都对称时,才是对称树,因此用与逻辑符 && 连接。
时空复杂度O(n)
打卡
打卡
https://leetcode.cn/problems/dui-cheng-de-er-cha-shu-lcof/solutions/2674257/dui-cheng-er-cha-shu-by-yukislab-vh88
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 checkSymmetricTree(self, root: Optional[TreeNode]) -> bool:
if not root:
return True
def recur(L,R):
if not L and not R:return True
if not L or not R or L.val != R.val:
return False
return recur(L.right,R.left) and recur(L.left,R.right)
时间 空间 o n
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
bool checkSymmetricTree(TreeNode root) {
if(!root) return true;
return recur(root->left,root->right);
}
bool recur(TreeNode* left, TreeNode* right){
if(left nullptr && right nullptr) return true;
if(left nullptr || right nullptr || left->val != right->val) return false;
return recur(left->left, right->right) && recur(left->right, right->left);
}
};
时间复杂度O(n),空间复杂度O(logn)
时间复杂度O(n)
空间复杂度O(n)
“`C++
class Solution {
public:
bool checkSymmetricTree(TreeNode* root) {
return check(root, root);
}
};
“`
思路:递归版本,定义一个函数递归处理,根据二叉树对称的图来看,对于两个对称的节点node1(左)和node2(右),判断其子节点是否对称时,只需要递归的判断
node1->left and node2->right,node1->right and node2->left。“`c++
class Solution {
public:
bool checkSymmetricNode(TreeNode* left, TreeNode* right) {
if (left && right) {
if (left->val != right->val) return false;
return checkSymmetricNode(left->left, right->right) && checkSymmetricNode(left->right, right->left);
}
else if (left || right) {
return false;
} else {
return true;
}
}
bool checkSymmetricTree(TreeNode* root) {
if (root == nullptr) return true;
return checkSymmetricNode(root->left, root->right);
}
};
“`
时间复杂度:O(n)
空间复杂度:树的高度
···java
class Solution {
public boolean checkSymmetricTree(TreeNode root) {
return check(root,root);
}
public boolean check(TreeNode left,TreeNode right){
if(leftnull&&rightnull){
return true;
}
if(leftnull||rightnull){
return false;
}
return left.valright.val&&check(left.left,right.right)&&check(left.right,right.left);
}
}
时间复杂度:O(n),空间复杂度与递归深度有关:O(n)
···
class Solution {
private boolean isSymmetric(TreeNode leftNode, TreeNode rightNode){
if(leftNode null & rightNodenull)
return true;
if(leftNode null || rightNode null || leftNode.val != rightNode.val)
return false;
return isSymmetric(leftNode.left,rightNode.right) && isSymmetric(leftNode.right,rightNode.left);
}
public boolean checkSymmetricTree(TreeNode root) {
if(root null)
return true;
return isSymmetric(root.left,root.right);
}
//递归实现,时空复杂度均为On