二叉树的最大深度
1.两种解法
递归法–后序遍历
采用后序遍历,先处理左孩子,再处理右孩子,最后处理中间节点;对于中间节点的处理就是求中间节点的最大深度,怎么求呢?
就是先求出中间节点的左子树的深度,再求出右子树的深度,然后取他们的最大值然后+1(这个+1是因为中间节点也算一层);
这样一看,是不是就发现需要做重复操作了。即想求中间节点的深度,就要求左子树深度,想求左子树深度,就要求左子树的左子树的深度(右子树同理)。这样一来我们就可以用后序遍历的逻辑(左右中)来写代码了。
递归出口就是,如果碰到了空节点,那么他的深度就是0。
代码如下:
def maxDepth(root):
if not root:
return 0
# 使用后序遍历
leftchild_depth = maxDepth(root.left) # 左
rightchild_depth = maxDepth(root.right) # 右
return max(leftchild_depth,rightchild_depth)+1 # 中
迭代法–层序遍历
看到这道题直观的想法就是,求深度的话那么我用层序遍历,定义一个变量,每到一层我就让这个变量+1,到最后这个变量的值就是深度了。那么我们要把这个变量+1的操作应该在层序遍历的什么位置呢,这里直接给出代码。
不清楚层序遍历的可以看我之前的文章:层序遍历
代码如下:
def maxDepth(root):
queue = []
depth = 0 # 定义depth变量
if not root:
return depth
# 初始化先把root放入queue中
queue.append(root)
while queue:
size = len(queue)
depth += 1 # 每遍历完一层的节点就+1
# 遍历该层的节点
for i in range(size):
node = queue.pop(0)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return depth
2.总结
递归的时候要用到后序遍历的逻辑,不是凭空想象的。