树的层序遍历
将上面的问题转化为层序遍历的一部分问题,那么我们怎么实现层序遍历呢?顺带复习层序遍历吧。
对每一层循环,获得每一层的下一层的全部结点,然后一次循环下去就可以走完全部了。当都没有下面的时候,我们就停止了吧。所以我们会用一个列表保存结果,用一个来干嘛呢?保存每一层的结果。然后就是每一层都会读取下一层。也需要保存吧!
class Solution:
def levelOrderBottom(self, root):
queue = [] # 结果列表
cur = [root] # 接下来要循环的当前层节点,存的是节点
while cur: # 当前层存在结点时
cur_layer_val = [] # 初始化当前层结果列表为空,存的是val
next_layer_node = [] # 初始化下一层结点列表为空
for node in cur: # 遍历当前层的每一个结点
if node: # 如果该结点不为空,则进行记录
cur_layer_val.append(node.val)
# 将该结点的值加入当前层结果列表的末尾 ,每一层的结点
next_layer_node.extend([node.left, node.right])
# 将该结点的左右孩子结点加入到下一层结点列表,每一层结点的下一个结点。
if cur_layer_val: # 只要当前层结果列表不为空
queue.insert(0, cur_layer_val) # 则把当前层结果列表插入到队列首端
cur = next_layer_node # 下一层的结点变成当前层,接着循环
return queue
如何改成找最深的深度呢?
class Solution:
def TreeDepth(self, pRoot):
cur = [pRoot]
depth = 0 # 接下来要循环的当前层节点,存的是节点
while cur: # 当前层存在结点时
next_layer_node = [] # 初始化下一层结点列表为空
for node in cur: # 遍历当前层的每一个结点
if node: # 如果该结点不为空,则进行记录
next_layer_node.extend([node.left, node.right]) # 将该结点的左右孩子结点加入到下一层结点列表 # 则把当前层结果列表插入到队列首端
cur = next_layer_node
depth += 1 # 下一层的结点变成当前层,接着循环
return (depth-1)
通过后序遍历得到树的深度了。通过递归的方法,走到深度,然后不断的返回,为了避免平行,选择最深的就是这个棵树的深度了。
class Solution:
def TreeDepth(self, pRoot):
# write code here
if pRoot == None:
return 0
nLeft = self.TreeDepth(pRoot.left) #往里面走走到底部
nRight = self.TreeDepth(pRoot.right) #往里面走走到底部
return max(nLeft+1,nRight+1)#(nLeft+1 if nLeft > nRight else nRight +1) #走到底部以后开始返回,返回最深的,就是树的深度。