python解决求二叉树的最长同值路径问题

对于给定的一颗二叉树,需要找到最长的路径,并且该路径上的每个节点具有相同的值的问题,对于寻找到的这条路径可以经过根节点也可以不经过根节点,两个节点之间的路径长度是由他们的变数来表示的,给定如下图的二叉树

python解决求二叉树的最长同值路径问题_第1张图片

添加图片注释,不超过 140 字(可选)

python解决求二叉树的最长同值路径问题_第2张图片

添加图片注释,不超过 140 字(可选)

给定的两颗二叉树的最长同值路径输出都为2。

给定问题的最长同值路径,想通过一个函数来对整个二叉树求解的话是较为复杂的,但是如果只对一个节点求同值路径的话,思路则较为清晰,这样就可以把这个复杂的原始问题分解成为了规模较小的子问题,所以考虑使用递归算法,以如下的二叉树作为例子,详细讲解递归函数的执行过程。

python解决求二叉树的最长同值路径问题_第3张图片

添加图片注释,不超过 140 字(可选)

python解决求二叉树的最长同值路径问题_第4张图片

添加图片注释,不超过 140 字(可选)

如上图显示,该图显示的是从执行A递归函数到最终返回所要求的最长同值路径的数值。A(5)会先入栈,根节点5的左子节点是4,然后A(4)入栈,节点4的左子节点是1,A(1)入栈,节点1的左子节点是空节点,所以A(NULL)入栈,最后A(NULL)的返回值是0,返回给上层,返回的0对应的是A(1)的left是0,此时执行A(1)函数内的right=self.A(root.right),即A(NULL)入栈。

python解决求二叉树的最长同值路径问题_第5张图片

添加图片注释,不超过 140 字(可选)

返回的0是A(1)函数中的right=0,此时A(1)函数可以执行语句return max(left,right),返回给上层0,并且A(1)出栈,如下图:

python解决求二叉树的最长同值路径问题_第6张图片

添加图片注释,不超过 140 字(可选)

返回的0是A(4)函数中的left=0,此时执行的是A(4)函数中的right=slef.A(root.right),节点4的右子节点是空节点,即A(NULL)入栈

python解决求二叉树的最长同值路径问题_第7张图片

添加图片注释,不超过 140 字(可选)

然后返回的0是A(4)函数中的right=0,此时A(4)函数可以执行语句return max(left,right),返回给上层0,A(4)出栈。

python解决求二叉树的最长同值路径问题_第8张图片

添加图片注释,不超过 140 字(可选)

使用python的代码实现如下:

class Solution(object):
    def main(self, root):   #主函数main
        self.max_length=0 #全局变量,用于保存当前最长同值路径
        self.A(root)
        return self.max_length
    def A(self,root):    #被调函数,也是递归函数
        if not root: 
            return 0
        left=self.A(root.left)
        right=self.A(root.right)
        if root.left and root.left.val==root.val:
            left+=1
        else:
            left=0
        if root.right and root.right.val==root.val:
            right+=1
        else:
            right=0
        self.max_length=max(self.max_length,left+right)
        return max(left,right) #返回给上层的是左右子路径最长同值路径

你可能感兴趣的:(算法,python,回归)