- 921. Minimum Add to Make Parentheses Valid 使括号有效的最少添加
- 915. Partition Array into Disjoint Intervals 分割数组
- 932. Beautiful Array 漂亮数组
- 940. Distinct Subsequences II 不同的子序列 II
题目地址:https://leetcode.com/problems/symmetric-tree/open in new window
Total Accepted: 106639 Total Submissions: 313969 Difficulty: Easy
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
Forexample, this binary tree [1,2,2,3,4,4,3] is symmetric:
1
/ \
2 2
/ \ / \
3 4 4 3
Butthe following [1,2,2,null,3,null,3] is not:
1
/ \
2 2
\ \
3 3
Note:
1、 Bonuspointsifyoucouldsolveitbothrecursivelyanditeratively.;
判断一棵二叉树是不是镜像二叉树。
如果一个树是对称的,那么意味着左右子树是镜像的。就像判断回文一样,每层的 左右两边对称位置 的节点是镜像的。
1
/ \
left-> 2 2 <-right
/ \ / \
3 4 4 3
定义新函数isMirror(left, right)
,该函数的意义是判断left
和 right
是不是对称的子树。
1、 当left
和right
的值相等的时候,需要判断下一层是否是对称的;
2、 在递归判断下一层的时候的时候,需要判断的是left.left
和right.right
这两棵树是不是对称的,以及left.right
和right.left
这两棵树是不是对称的;
代码只是上面的思路的实现,可以用递归来完成。递归最重要的是 要明白函数的定义、输入、输出,如果这些没明白一定会把自己绕进去。另外递归的时候应该把递归函数当做黑盒使用,即不需要知道此函数内部怎么实现的,但是调用这个递归函数就是能达到某个功能。这样会帮助理解递归。
本题提醒了我们:在递归的过程中不一定只有一个参数,也可以同时传了两个参数,每次递归的时候同时改变两个采纳数。
Java代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSymmetric(TreeNode root) {
return isMirror(root,root);
}
public boolean isMirror(TreeNode left,TreeNode right){
if(left == null && right == null) return true;
if(left == null || right == null) return false;
return (left.val == right.val) && isMirror(left.left,right.right) && isMirror(left.right,right.left);
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
AC:1ms
二刷的时候写的Python解法如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if not root: 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 or not right: return False
return left.val == right.val and self.isMirror(left.left, right.right) and self.isMirror(left.right, right.left)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
BFS使用一个队列,把要判断是否为镜像的节点放在一起。
在队列中同时取出两个节点left, right
,判断这两个节点的值是否相等,然后把他们的孩子中按照(left.left, right.right)
一组,(left.right, right.left)
一组放入队列中。
BFS做法需要把所有的节点都检查完才能确定返回结果True
,除非提前遇到不同的节点值而终止返回False
。
Java代码如下:
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSymmetric(TreeNode root) {
Queue<TreeNode> q = new LinkedList<>();
q.add(root);
q.add(root);
while(!q.isEmpty()){
TreeNode left=q.poll();
TreeNode right=q.poll();
if(left==null && right==null) continue;
if(left==null || right==null) return false;
if(left.val != right.val) return false;
q.add(left.left);
q.add(right.right);
q.add(left.right);
q.add(right.left);
}
return true;
}
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
AC:3ms
二刷的时候的Python解法如下:
# Definition for a binary tree node.
# class TreeNode(object):
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution(object):
def isSymmetric(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
if not root: return True
que = collections.deque()
que.append(root.left)
que.append(root.right)
while que:
left, right = que.popleft(), que.popleft()
if not left and not right:
continue
if not left or not right:
return False
if left.val != right.val:
return False
que.append(left.left)
que.append(right.right)
que.append(left.right)
que.append(right.left)
return True
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
一种便于理解的BFS做法,把要判断的是否对称节点作为tuple一起放入队列中:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSymmetric(self, root: TreeNode) -> bool:
queue = collections.deque()
queue.append((root, root))
while queue:
left, right = queue.popleft()
if not left and not right:
continue
if not left or not right:
return False
if left.val != right.val:
return False
queue.append((left.left, right.right))
queue.append((left.right, right.left))
return True
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有
本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发
按照建议尝试这个新的stackoverflow :) 这并不是haskell 特有的,但它在haskell 中是最清楚的。 这是一个每隔一段时间就会出现的模式:一个函数接受两个对称处理的参数。 map
我存储了一些敏感数据。数据被分成几部分,我想对每个部分进行单独的访问。假设我有 1000 个文件。我想通过相同的对称加密算法加密每个文件。 我想当黑客有 1000 个密码时破解 key 比他只有一个密
这个问题在这里已经有了答案: With arrays, why is it the case that a[5] == 5[a]? (20 个答案) 关闭 7 年前。 我正在尝试解开这个谜团: in
题目地址:https://leetcode.com/problems/symmetric-tree/open in new window Total Accepted: 106639 Total S
我很难想出一种可以创建短(8 个字符)推荐代码的算法。我想使用一种易于内存的模式,其中不可能在代码中出现令人反感的词。我也不希望任何字母与数字混淆——所以没有 1、l、0 和 O。我想出的模式是 aa
我有一张这样的 table : _id sender_id receiver_id text 1 1 2 xxx 2 2 1
我有一张这样的 table : _id sender_id receiver_id text 1 1 2 xxx 2 2 1
我有两个以弧度为单位的角度值数组。这两个阵列关于已知的恒定角是对称的。数组如图所示: 示例值如下: one = [ 2.98153965 -1.33298928 2.94993567 -1.3
在以下代码中:symmetryCryptoKey 表示应始终受到保护的私有(private)信息,因为它是加密对称 key 的解密版本。 问题: 是否可以进行其他增强来保护 Multi-Tenancy
我做了一个简单的函数,称为symmetricDelta(),它“对称地”计算value和previous之间的差异。我的意思是:考虑一个数字行,例如0到ULLONG_MAX,在此处连接数字线的左右两端
最近我开始从事加密工作。我有一个功能正常的非对称加密类,但我还需要一个对称 key 类。尽管对称 key 类的大多数方面都可以正常工作,但从其编码字节加载 key 却无法正常工作。以下是对称 key
我试图在 python3 中将整数拆分为“尽可能对称的数组”,但似乎不太正确。 所需的输入/输出可以通过此数据模式表进行描述。 # data pattern TABLE # INPUT (int) =
关闭。这个问题是opinion-based .它目前不接受答案。 想要改进这个问题? 更新问题,以便 editing this post 可以用事实和引用来回答它. 关闭 4 年前。 Improve
客户有一个简单的递增顺序号(1、2、3...)。他希望最终用户收到一个 8 位或 9 位(仅限数字——无字符)“随机”数字。显然,这个“随机”数实际上必须是唯一且可逆的(它实际上是对实际订单号的加密)
由于不可变数据结构是一流的值,我们可以像比较任何其他值一样比较它们的相等性或顺序。但是在 BCL 不可变集合预览中事情变得复杂,因为每个不可变集合都可以通过 IEqualityComparer 进行参
我编写了以下用于编码和解码字符串数据的类(一键对称算法): using System; using System.Collections.Generic; using System.Linq; usi
我正在尝试使用 Java 8 流来组合列表。如何从两个现有列表中获取“对称差异列表”(所有对象仅存在于一个列表中)。我知道如何获得相交列表以及如何获得联合列表。 在下面的代码中,我想要来自两个汽车列表
我有一个矩阵如下; 1 2 3 4 5 1 0 1 1 0 0 2 0 0 1 1 0 3 1 0 0 0 1 4 0 0 1 0 0
我想定义一个具有以下属性的函数 symmetricLazyOr :: Bool -> Bool -> Bool symmetricLazyOr True _|_ === True symmetricL
例如: class Contact(models.Model): contacts = models.ManyToManyField('self', through='ContactRelat
我是一名优秀的程序员,十分优秀!