今天偶尔翻起来leetcode,用英文网站的也试做了一下,感觉还是英文的好,有讨论区有答案对比,更丰富一些。
100.相同的树
给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1:
输入: 1 1 / \ / \ 2 3 2 3 [1,2,3], [1,2,3] 输出: true
示例 2:
输入: 1 1 / \ 2 2 [1,2], [1,null,2] 输出: false
示例 3:
输入: 1 1 / \ / \ 2 1 1 2 [1,2,1], [1,1,2] 输出: false
思路是一个递归自顶向下找的过程。判断两个都是空就True,一空另一个不空就是False,接下来val值不相等就False,以及左右子树对不上就False,这些都不是再比较左右子树:左子树或者右子树有一个是False直接返回False。代码如下:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isSameTree(self, p, q):
"""
:type p: TreeNode
:type q: TreeNode
:rtype: bool
"""
if p == None and q == None:
return True
elif (p == None and q != None) or (p != None and q == None):
return False
if p.val != q.val:
return False
elif (p.left != None and q.left == None) or (p.left == None and q.left != None) or \
(p.right != None and q.right == None) or (p.right == None and q.right != None):
return False
else:
result1 = self.isSameTree(p.left, q.left)
if not result1:
return False
result2 = self.isSameTree(p.right, q.right)
if not result2:
return False
return True
在末尾判断左右子树那块,一开始没加的,leetcode提示通过,但只赢了5%左右的代码……我果断加上了这部分提前判断,一下就升到了96.05%。可见时间复杂度差距还是挺大的!
110.平衡二叉树
给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。
示例 1:
给定二叉树 [3,9,20,null,null,15,7]
3 / \ 9 20 / \ 15 7
返回 true
。
示例 2:
给定二叉树 [1,2,2,3,3,null,null,4,4]
1 / \ 2 2 / \ 3 3 / \ 4 4
返回 false
。
思路就是递归下去求子树的高度。叶节点的下边,就是nil(算法导论里的那种节点,其实没有,就是个None)的高度为0;每个节点(包括叶节点)的高度是两个子节点高度中的较大值+1。所以定义一个calHeight方法,并不难写。
此题一个关键点是,如果在某个分叉遇到了高度差大于2,应及时返回FALSE,后边的检查都不需要做了。我的做法是返回一个两个元素的list,第一个是高度,第二个是是否需要检查(即之前已经判断出是否高度差小于等于1)。最后代码如下:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def isBalanced(self, root):
"""
:type root: TreeNode
:rtype: bool
"""
result = self.calHeight(root, True)
return result[1]
def calHeight(self, node, needCheck):
if not needCheck:
return [2, False]
else:
if node == None:
return [0, True]
else:
leftheight = self.calHeight(node.left, True)
print(leftheight)
if not leftheight[1]:
return [2, False]
rightheight = self.calHeight(node.right, True)
print(rightheight)
if not rightheight[1]:
return [2, False]
if abs(leftheight[0] - rightheight[0]) > 1:
return [2, False]
else:
return [max(leftheight[0], rightheight[0]) + 1, True]
最终用时beat了100%用python的代码,哈哈哈还挺高兴的!