作为要准备踏入码农行业的人来说,要准备校招,怎么能不去刷刷LeetCode呢?
559.n叉树的最大深度
- 题目要求
给定一个 N 叉树,找到其最大深度。
最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。
- 例如
给定一个 3叉树 :
1
3 2 4
5
我们应返回其最大深度,3。
- 分析
方法:层次遍历和深度遍历获取最大值皆可
class Solution(object):
def maxDepth(self, root):
if not root:
return 0
if not root.children:
return 1
"""
层次遍历
queue=[]
queue.append(root)
result=0
while queue:
result+=1
size=len(queue)
for n in range(size):
node = queue.pop(0)
if node.children:
queue.extend(node.children)
return result
"""
return self.dfs(root)
def dfs(self,root):
if root is None:
return 0
result=0
for c in root.children:
result=max(result,self.dfs(c))
return result+1
作为要准备踏入码农行业的人来说,要准备校招,怎么能不去刷刷LeetCode呢?
563.二叉树的坡度
- 题目要求
给定一个二叉树,计算整个树的坡度。
一个树的节点的坡度定义即为,该节点左子树的结点之和和右子树结点之和的差的绝对值。空结点的的坡度是0。
整个树的坡度就是其所有节点的坡度之和。
- 例如
输入:
1
/ \
2 3
输出: 1
解释:
结点的坡度 2 : 0
结点的坡度 3 : 0
结点的坡度 1 : |2-3| = 1
树的坡度 : 0 + 0 + 1 = 1
注意:
任何子树的结点的和不会超过32位整数的范围。
坡度的值不会超过32位整数的范围。
- 分析
方法:根据题意深度搜索,获取每个节点的坡度并获取其子树的节点之和
class Solution(object):
def findTilt(self, root):
self.nums=0
self.poudu(root)
return self.nums
def poudu(self,root):
if root is None:
self.nums+=0
return 0
left=self.poudu(root.left)
right=self.poudu(root.right)
self.nums+=abs(left-right)
return left+right+root.val
作为要准备踏入码农行业的人来说,要准备校招,怎么能不去刷刷LeetCode呢?
572.另一个树的子树
- 题目要求
给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。
- 例如
给定的树 s:
3
/ \
4 5
/ \
1 2
给定的树 t:
4
/ \
1 2
返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
示例 2:
给定的树 s:
3
/ \
4 5
/ \
1 2
/
0
给定的树 t:
4
/ \
1 2
返回 false。
- 分析
方法:前序遍历,遇到空节点保存一个值o,比较两个遍历后的列表是否存在序列
class Solution(object):
def isSubtree(self, s, t):
s_l=[]
t_l=[]
self.xianxu(s,s_l)
self.xianxu(t,t_l)
length=len(t_l)
i=0
while i+length<=len(s_l):
if s_l[i:i+length]==t_l:
return True
i+=1
return False
def xianxu(self,root,lists):
if not root:
lists.append('o')
return
lists.append(root.val)
self.xianxu(root.left,lists)
self.xianxu(root.right,lists)