# 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
stack=[]
stack.append(root.left)
stack.append(root.right)
while stack:
rcur=stack.pop()
lcur=stack.pop()
if not rcur and not lcur: continue
if not rcur or not lcur: return False
if rcur.val != lcur.val: return False #值不相等,不对称
stack.append(lcur.left) #左孩子左节点
stack.append(rcur.right) #右孩子右节点
stack.append(lcur.right) #左孩子右节点
stack.append(rcur.left) #右孩子左节点
# if cur.left: stack.append(cur.left)
# if cur.right: stack.append(cur.right)
# chlen=len(stack)
# if chlen%2!=0: return False
# for i in range(chlen//2):
# if stack[i].val!=stack[chlen-i-1].val:
# return False
return True
递归法
这个思路就非常清晰了。参考迭代法的思路。
递归的对象是(左左,右右)和(左右,右左)子树
# 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,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.isSymmetric(l.left,r.right) and self.isSymmetric(l.right,r.left)
def checkSymmetricTree(self, root: Optional[TreeNode]) -> bool:
if not root: return True
return self.isSymmetric(root.left,root.right)
class Solution:
def checkSymmetricTree(self, root: Optional[TreeNode]) -> bool:
if not root or (not root.left and not root.right): return True
return self.check(root.left, root.right)
def check(self, left, right):
if not left and not right:
return True
if not left or not right:
return False
if left.val != right.val:
return False
return self.check(left.left, right.right) and self.check(left.right, right.left)
共以下 24 个回答
迭代法(不是层序遍历)
6
7 7
8 8 9 9
任意的左右子树,都是这个规则,左左–右右,左右-右左。可以模拟第四层
递归法
这个思路就非常清晰了。参考迭代法的思路。
递归的对象是(左左,右右)和(左右,右左)子树
递归
1、传入要比较的两个子树,返回bool
2、终止条件:全空为真,一空一非空为假,都不空时结点值相同为假。
3、外层递归传入(左树的左,右树的右),内层递归传入(左树的右,右树的左),两者取&作返回值
LCR 145. 判断对称二叉树
递归
题解
“`java
递归
class Solution {
public:
bool checkSymmetricTree(TreeNode* root) {
if (!root)
return true;
return recue(root->left, root->right);
}
bool recue(TreeNode* L, TreeNode* R) {
if (!L && !R)
return true;
if (!L || !R || L->val != R->val)
return false;
return recue(L->left, R->right) && recue(L->right, R->left);
}
};
构造一个镜像的翻转树,逐个节点比较
方法 递归 对着left和right递归 在递归函数中进行条件的判断,注意一些条件的顺序不然有可能会被覆盖掉结果导致错误。
time O(n) space O(n)
思路:类似的递归套路,但是相对于之前,这次是需要分别对对称位置的子树递归来比较,还需要比较当前节点的值
时间复杂度O(N),空间也是O(N)
时间复杂度O(n),空间复杂度O(n)
class Solution {
public boolean checkSymmetricTree(TreeNode root) {
if(root null){
return true;
}
return isSame(root.left, root.right);
}
}
时间:O(n)
空间:O(n)
双指针镜像遍历
OnOn
时间复杂度O(N),空间复杂度O(H)。
时间o(n)
空间o(n)
//时间复杂度 O(N)
class Solution {
public boolean checkSymmetricTree(TreeNode root) {
if (root null) {
return true;
}
}
时间复杂度:O(n)
空间复杂度:树的高度
打卡
时间复杂度O(n),空间复杂度O(lgn))(最坏情况O(n))
递归判断左右子树是否相等,但是比较算法的左右子树要倒过来
时间复杂度O(n)
空间复杂度O(n)
···cpp
class Solution {
public:
bool isEqualNode(TreeNode* left, TreeNode* right){
if(!left && !right) return true;
else if(!left || !right) return false;
else if(left->val != right->val) return false;
};
// 思路:先判断当前节点的左右节点是否对称,再判断左左和右右及左右和右左,依次类推。
// 时间复杂度:o(n)
// 空间复杂度:o(lgn)
“`
思路: 递归 首先判断 当前两个节点nodeLeft.val nodeRight.val 是否相同,若相同 则比较 nodeLeft.left, nodeRight.right && nodeLeft.right, nodeRight.left 是否相同
递归
递归地判断两颗子树是否镜像对称,判断两颗子树的根节点是否相等之后,还需要递归地检查左子树的左子树和右子树的右子树是否对称,以及左子树的右子树和右子树的左子树是否对称。
时间复杂度:O(n),遍历二叉树的每个节点。
空间复杂度:O(n)(最坏情况)或 O(logn)(平均情况)。
迭代
使用队列来逐个遍历二叉树节点,判断二叉树是否镜像对称。
时间复杂度:O(n),遍历二叉树的每个节点。
空间复杂度:O(n)(最坏情况)或 O(logn)(平均情况)。