每日一题-二叉树最长连续路径

[每日一题] (二叉树最长连续路径)
在一个二叉树中找出最长连续递增的path,输出path中node的个数。path只能从上到下
Follow-up:path可以从下到上然后从上到下

解题思路


本次的代码没有经过具体测试,仅作讨论用途-.-
原题: 使用递归,每次都计算当前最长路径长度
Follow-up: 使用递归,每次递归的时候计算以当前结点为子树时的最长路径以及与父结点的连续路径。
     具体方法是在每个结点递归调用两次函数,计算左右子树的最长路径长度和连续路径长度,然后比较后返回以该结点为子树最长路径长度和连续路径长度

Python:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/usr/bin/env
# -*- coding:utf-8 -*-
# 原题
class Solution(object):
def longestPath(self, root):
if root == None:
return 0
left = self.recursive(root.left, root.val, 1) # 求左边子树的最大长度
right = self.recursive(root.right, root.val, 1) # 求右边子树的最大长度
return max(left, 1, right)
def recursive(self, node, preVal, tempLength):
if node == None:
return 0
thisLength = tempLength + 1 if node.val == preVal + 1 else 1 # 如果该节点和父节点连续,则当前最大长度为父节点的最大长度+1,否则为1
left = self.recursive(node.left, node.val, thisLength) # 找左子树最大长度
right = self.recursive(node.right, node.val, thisLength) # 找右子树最大长度
return max(left, thisLength, right) # 返回当前节点以后的节点的最大路径长度
# Follow-up
class Solution(object):
def longestPath(self, root):
if root == None:
return 0
left, Lbig, Lsmall= self.recursive(root.left, root.val) # left代表左子树的最长路径长度, Lbig代表root节点左子树中比root大的连续路径长度, Lsmall代表root节点左子树中比root小的连续路径长度
right, Rbig, Rsmall = self.recursive(root.right, root.val) # right代表右子树的最长路径长度, Rbig代表root节点右子树中比root大的连续路径长度, Rsmall代表root节点右子树中比root小的连续路径长度
thisLength = max(left, right, Lbig+1+Rsmall, Rbig+1+Lsmall) # 以当前节点为根的子树的最长路径长度
return thisLength
def recursive(self, node, preVal): # 每次递归计算出以当前node为根的子树的最长路径长度
if root == None:
return 0, 0, 0
left, Lbig, Lsmall = self.recursive(root.left, root.val)
right, Rbig, Rsmall = self.recursive(root.right, root.val)
thisLength = max(left, right, Lbig+1+Rsmall, Rbig+1+Lsmall)
if root.val == preVal + 1:
return thisLength, max(Lbig, Rbig)+1, 0
elif root.val == preVal - 1:
return thisLength, 0, max(Lsmall, Rsmall)+1
else:
return thisLength, 0, 0