对于给定的一颗二叉树,需要找到最长的路径,并且该路径上的每个节点具有相同的值的问题,对于寻找到的这条路径可以经过根节点也可以不经过根节点,两个节点之间的路径长度是由他们的变数来表示的,给定如下图的二叉树
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 140 字(可选)
给定的两颗二叉树的最长同值路径输出都为2。
给定问题的最长同值路径,想通过一个函数来对整个二叉树求解的话是较为复杂的,但是如果只对一个节点求同值路径的话,思路则较为清晰,这样就可以把这个复杂的原始问题分解成为了规模较小的子问题,所以考虑使用递归算法,以如下的二叉树作为例子,详细讲解递归函数的执行过程。
添加图片注释,不超过 140 字(可选)
添加图片注释,不超过 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)入栈。
添加图片注释,不超过 140 字(可选)
返回的0是A(1)函数中的right=0,此时A(1)函数可以执行语句return max(left,right),返回给上层0,并且A(1)出栈,如下图:
添加图片注释,不超过 140 字(可选)
返回的0是A(4)函数中的left=0,此时执行的是A(4)函数中的right=slef.A(root.right),节点4的右子节点是空节点,即A(NULL)入栈
添加图片注释,不超过 140 字(可选)
然后返回的0是A(4)函数中的right=0,此时A(4)函数可以执行语句return max(left,right),返回给上层0,A(4)出栈。
添加图片注释,不超过 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) #返回给上层的是左右子路径最长同值路径