【leetcode】Path Sum IV

If the depth of a tree is smaller than 5, then this tree can be represented by a list of three-digits integers.

For each integer in this list:
The hundreds digit represents the depth D of this node, 1 <= D <= 4.
The tens digit represents the position P of this node in the level it belongs to, 1 <= P <= 8. The position is the same as that in a full binary tree.
The units digit represents the value V of this node, 0 <= V <= 9.
Given a list of ascending three-digits integers representing a binary with the depth smaller than 5. You need to return the sum of all paths from the root towards the leaves.

Example 1:
Input: [113, 215, 221]
Output: 12
Explanation: 
The tree that the list represents is:
    3
   / \
  5   1

The path sum is (3 + 5) + (3 + 1) = 12.
Example 2:
Input: [113, 221]
Output: 4
Explanation: 
The tree that the list represents is: 
    3
     \
      1

The path sum is (3 + 1) = 4.

 

这个题目比较直接的方法是把二叉树建立起来,然后从根节点开始依次遍历各个叶子节点。这个方案会比较麻烦,因为涉及到回溯等等。更为简便的方法是从叶子节点往根节点遍历,把每个叶子节点遍历到根节点的和累加就行。 

1. 找出所有的叶子节点。这个比较简单,遍历nums数组的每个元素,假设元素的值是abc,那么只要判断(a+1)(b*2)*或者(a+1)(b*2-1)*在不在nums数组中即可。【b*2中的*表示乘号,括号后面的*表示通配符】

def IsLeaf(self,nums,node):
        dep = node/100
        pos = (node%100)/10

        next = (dep+1)*10 + pos*2
        next2 = (dep+1)*10 + pos*2 -1
        for i in nums:
            if i/10 == next or i/10 == next2:
                return False
        return True

2. 找出叶子节点的父节点。这个同理,假设叶子节点的值是假设元素的值是abc,那么其父节点是(a-1)(b/2)*或者是(a-1)((b+1)/2)*。

def getParent(self,nums,node):
        dep = node/100
        pos = (node%100)/10
        val = (node%100)%10
        for i in nums:
            if i/100 != dep -1:
                continue
            p = (i%100)/10
            if p*2 == pos or p*2 == pos+1:
                self.count += (i%100)%10
                return i
        return node

3.接下来就是开始求和了。

完整代码如下:

class Solution(object):
    count = 0
    def getParent(self,nums,node):
        dep = node/100
        pos = (node%100)/10
        val = (node%100)%10for i in nums:
            if i/100 != dep -1:
                continue
            p = (i%100)/10
            if p*2 == pos or p*2 == pos+1:
                self.count += (i%100)%10
                return i
        return node
    def IsLeaf(self,nums,node):
        dep = node/100
        pos = (node%100)/10

        next = (dep+1)*10 + pos*2
        next2 = (dep+1)*10 + pos*2 -1
        for i in nums:
            if i/10 == next or i/10 == next2:
                return False
        return True


    def pathSum(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        maxDep = 0
        for i in nums:
            if maxDep < i /100:
                maxDep = i/100
        for i in nums:
            if self.IsLeaf(nums,i) == False:
                continue
            else:
                self.count += (i%100)%10
                while True:
                    i = self.getParent(nums,i)
                    if i /100 == 1:
                        break


        return self.count

 

posted @ 2017-08-29 10:55  seyjs  阅读(162)  评论(0编辑  收藏  举报