def isSymmetric(root: TreeNode) -> bool:
if root == None or (root.left == None and root.right == None):
return True
return f(root.left,root.rigth)
# 判断A,B是否值相同
def f(A,B):
if A == None and B == None:
return True
if A == None or B == None:
return False
if A.val != B.val:
return False
return f(A.left,B.right) and f(A.right,B.left)
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
if not root or not (root.left or root.right): return True
num = [root.left,root.right]
while num:
tem1 = num.pop(0)
tem2 = num.pop(0)
if not (tem1 or tem2):
continue
if not (tem1 and tem2) or tem1.val != tem2.val: #有左没右,有右没左
return False
num.append(tem1.left)
num.append(tem2.right)
num.append(tem1.right)
num.append(tem2.left)
return True
class Solution:
def check(self, a:TreeNode, b:TreeNode) -> bool:
if not a and not b:
return True
if not a or not b:
return False
if a.val == b.val:
return self.check(a.left,b.right) and self.check(a.right,b.left)
else:
return False
def isSymmetric(self, root: TreeNode) -> bool:
if root:
return self.check(root.left, root.right)
return True
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
# 考虑从顶至底递归,判断每对节点是否对称,从而判断树是否为对称二叉树。
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.left,R.right) and recur(L.right,R.left)
return recur(root.left, root.right) if root else True
共以下 51 个回答
判断是否对称,采用双指针的思想
O(N) 构造 + 检查
O(N) 迭代
时间O(N)空间O(N)
没想到需要两个节点
简单递归
由于是对称,需要两个子树,另借助一个接收两个树节点的递归函数。主要的判断条件就是从两个比较的根节点开始判断,相同则递归判断左子树的左子树与右子树的右子树,左子树的右子树与右子树的左子树。base 有很多种,最重要的就是递归到同时全为NULL证明对称,其中一个为NULL证明没有对上,根值不同一定不对称。
时间复杂度O(n)
空间复杂度O(n)
思路:
递归三要素:
1. 明确你这个函数想要干什么: 对比左子树和右子树是否是镜像
2. 寻找递归结束条件:
+ 当 L和 R 同时越过叶节点: 此树从顶至底的节点都对称,因此返回 true;
+ 当 L 或 R中只有一个越过叶节点: 此树不对称,因此返回 false ;
+ 当节点 L的值 != 节点 R的 值: 此树不对称,因此返回 false
时间复杂度:O(n)
空间复杂度:O(n)
时间/空间复杂度:O(n)
时间O(n),空间O(n)
时间复杂度为 O(n)
空间复杂度为 O(n)
思路:从顶至底递归,判断每对节点是否对称,从而判断树是否为对称二叉树
递归遍历,分别遍历左右子树
思路:就是模拟。只不过实现方式不同,可以递归,可以迭代。递归实现的时间复杂度O(N),空间复杂度O(height)。
时间复杂度:O(n)
空间复杂度:O(n)
时间复杂度On
空间复杂度On
学习新思想,做好每道题,迭代的想法,时间复杂度O(n),空间复杂度O(n)
啊
解题思路:考虑从顶至底递归,判断每对节点是否对称,从而判断树是否为对称二叉树。
时间复杂度:O(n)
空间复杂度:O(n)
下面代码
前序遍历,对俩子节点递归比较是否一致。
时间O(n),空间O(1)
时间复杂度O(n)
空间复杂度O(n)
//recursion
递归写法
class Solution {
public:
bool fun(TreeNode* l,TreeNode* r){
if(!l&&!r) return true;
if(!l&&r) return false;
if(l&&!r) return false;
if(l->val!=r->val) return false;
return fun(l->left,r->right)&&fun(l->right,r->left);
}
bool isSymmetric(TreeNode* root) {
if(!root) return true;
return fun(root->left,root->right);
};
比较内侧和外侧是否对称
时间:O(n)
空间:O(n)
递归,第一次提交有bug,发现是第三个if得在第四个if之前,不然为空了,第一次没考虑到.
时间O(n)
空间O(n)
从顶到底依次递归判断镜像的值是否相等
//if的情况不能想复杂,逐层排除返回情况
归**
时间复杂度O(N)需要遍历所有节点 空间复杂度O(N) 最坏情况为链表
队列模拟迭代
1、运用递归求解,先判断终止条件,如果根节点为空或根的左右节点为空,则返回true
2、新建一个函数,用来判断根节点的左右节点是不是对称的
时间复杂度O(n) 空间复杂度O(n)
时间复杂度为O(n),空间复杂度为O(lgn)
递归思想解决,需要注意的是这道题给出的是根节点,我被诱导考虑只用一个根节点怎么实现这道题递归。后来反应过来这是不行的,因为判断左-左?=右-右 与 左-右?=右-左,需要传进去两棵树,所以需要自己重写一个函数。
时间 O(n)
空间 如果考虑递归调用栈的压栈空间 可能需要O(n),不计算压栈空间就是O(1)
时间:O(n),空间:O(n)