题目1:二叉树的深度
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点一次经过的节点形成树的一条路径,从最长路径的长度为树的深度。
例:
1
/ \
2 3
/ \ \
4 5 6
/
7
深度为4。
思路
- 深度优先遍历,返回当前子树深度。H(root) = max(H(root.left), H(root.right)) + 1。
- 时间复杂度:O(n)
- 空间复杂度:O(n)
- 层次遍历,记录层数。
- 时间复杂度:O(n)
- 空间复杂度:O(n)
代码
思路1:时间复杂度:O(n),空间复杂度:O(n)
def depth_of_tree(root):
"""
:param root: tree root
:return: height of tree
"""
if not root:
return 0
left = depth_of_tree(root.left)
right = depth_of_tree(root.right)
return max(left, right) + 1
题目2:平衡二叉树
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。如果某二叉树中任意节点的左、右子树的深度相差不超过1,
那么它就是一棵平衡二叉树。
思路
- 同理题目1,返回深度判断是否相差为1即可。
- 时间复杂度:O(n)
- 空间复杂度:O(n)
代码
思路1:时间复杂度:O(n),空间复杂度:O(n)
def is_balanced(root):
"""
:param root:binary tree root
:return: is balanced
"""
def core(root):
if not root:
return 0
left = core(root.left)
right = core(root.right)
if left == -1 or right == -1 or abs(left - right) > 1:
return -1
else:
return 1 + max(left, right)
return core(root) != -1
思考
相同的题目
LeetCode 104. 二叉树的最大深度
给定一个二叉树,找出其最大深度。
二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。
示例:
给定二叉树 [3,9,20,null,null,15,7],
3
/ \
9 20
/ \
15 7
返回它的最大深度 3 。
代码(思路2)
class Solution(object):
def maxDepth(self, root):
"""
:type root: TreeNode
:rtype: int
"""
if root:
search = [root]
else:
return 0
count = 0
while search:
layer = search[:]
for node in layer:
if node.left:
search.append(node.left)
if node.right:
search.append(node.right)
search.pop(0)
# print(search)
count += 1
return count
相同的题目
LeetCode 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 。