这题不难,本质上还是深度优先遍历,那么思路和之前还是类似的。
但是这里要注意的是,局部变量与全局变量的问题。
Python中创建的列表,默认是以全局变量的形式存在的,除了有时候会遇到深拷贝和浅拷贝的问题,其余使用都很直觉。
但是Python中的变量int等数据,在创建是在一个函数中却是局部变量的形式存在!!!而在这些结构体内去创建这些变量数据,必须用self.变量的形式才可以将该变量看做是全局变量形式使用!!!
那么想清楚这个全局和局部的问题,解法就很简单了,和剑指Offer10题目其实本质上是一样的,深度优先遍历到最深的地方,在叶子节点时,回头到其父节点,同时deep-1即可,并且每次到达叶子节点时,判断一下该deep值是否是最大值(即最深值),如果此时算的deep值是最深值,则将其存储起来,最后返回一下即可。
见代码:
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def TreeDepth(self, pRoot):
# write code here
self.deep = 0 # 注意deep和tmp_deep要作为全局变量使用!
self.tmp_deep = 0
if pRoot is None:
return self.deep
def helper(root): # 解法和深度优先遍历没区别
self.tmp_deep += 1
if root.left is None and root.right is None:
if self.tmp_deep > self.deep: # 判断一下,如果的确最深,就保存起来,否则不保存
self.deep = self.tmp_deep
if root.left is not None:
left = helper(root.left)
if root.right is not None:
right = helper(root.right)
self.tmp_deep -= 1
helper(pRoot)
return self.deep
以上是我自己的思路解法,看了评论区,还发现了大神级别的写法,也非常容易理解。
先上代码,再上解释。
class Solution:
def TreeDepth(self, pRoot):
# write code here
if pRoot is None:
return 0
# 使用递归
count = max(self.TreeDepth(pRoot.left),self.TreeDepth(pRoot.right)) + 1
return count
这里其实就是标准的递归题的思考方式。
- 明确函数作用,该题的函数作用就是返回当前节点情况下,这棵树的深度。
- 找到递归关系,即找到该树和其子树的递归关系,该节点的树的深度=其下面左/右子树的深度 + 1,但是由于我们要求的是最深的,那么肯定是要进行一个max函数的判断,所以就有了上面代码里的那句count=…语句。
- 明确递归结束的条件,当当前节点为None时,直接返回0即可。