剑指Offer11-二叉树的深度

在这里插入图片描述
这题不难,本质上还是深度优先遍历,那么思路和之前还是类似的。
但是这里要注意的是,局部变量与全局变量的问题。

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. 明确函数作用,该题的函数作用就是返回当前节点情况下,这棵树的深度。
  2. 找到递归关系,即找到该树和其子树的递归关系,该节点的树的深度=其下面左/右子树的深度 + 1,但是由于我们要求的是最深的,那么肯定是要进行一个max函数的判断,所以就有了上面代码里的那句count=…语句。
  3. 明确递归结束的条件,当当前节点为None时,直接返回0即可。
发布了71 篇原创文章 · 获赞 20 · 访问量 4834

猜你喜欢

转载自blog.csdn.net/qq_22795223/article/details/105486182