Longest Univalue Path

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):

    def longestUnivaluePath(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        if root == None:
            return 0

        cnt = 0
        #self.max_path = 0

        max_path = [0]

        def dfs(root):
            if root == None:
                return 0

            left = dfs(root.left)
            right = dfs(root.right)
            tmp1 = 0
            tmp2 = 0

            if root.left and root.left.val == root.val:
                tmp1 = left + 1
            if root.right and root.right.val == root.val:
                tmp2 = right + 1

            if (tmp1 + tmp2) > max_path[0]:
                max_path[0] = tmp1 + tmp2

            return max(tmp1, tmp2) 


        dfs(root)
        return max_path[0]

If input data is presented by list, for example:
Vertex, V=[2,2,3], means there are three vertex v1, v2, v3 with weighted value 2, 2, 3 respectively
Edges, E=[1,2,1,3], where edge1 is (v1, v2), edge2 is (v1,v3)

#!/usr/bin/env python
from Queue import PriorityQueue

class TreeNode(object):
    def __init__(self, x):
        self.val = x
        self.neighbor = set()

if __name__ == '__main__':

    # V = [4,4,4,2,2,2]
    # E = [1,2,1,3,2,4,2,5,2,6]
    V = [1,1,3,1,3,1]
    E = [1,1,2,3,2,4,2,5,4,6]

    tree = {}

    for i in range(len(E)/2):
        idx1 = E[i*2]
        idx2 = E[i*2-1]

        if not idx1 in tree:
            node1 = TreeNode(V[idx1-1])
            tree[idx1] = node1
        else:
            node1 = tree[idx1]

        if not idx2 in tree:
            node2 = TreeNode(V[idx2-1])
            tree[idx2] = node2
        else:
            node2 = tree[idx2]

        node1.neighbor.add(node2)
        node2.neighbor.add(node1)

    visited = set()
    max_len = 0

    def dfs(node, parent_val):
        global max_len

        if node in visited:
            return 0

        visited.add(node)

        q = PriorityQueue()
        for v in node.neighbor:
            q.put(-dfs(v, node.val))

        max1 = 0
        max2 = 0
        if q.qsize() >= 2:
            max1 = -q.get()
            max2 = -q.get()
            max_len = max(max_len, max1+max2)
        elif q.qsize == 1:
            max1 = -q.get()
            max_len = max(max_len, max1)

        if parent_val == node.val:
            return max1 + 1
        else:
            return 0


    dfs(tree[1], -V[0])
    return max_len

results matching ""

    No results matching ""