Python算法练习 10.24

leetcode 199 二叉树的深度

给定一个二叉树的 根节点 root,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

示例 1:

Python算法练习 10.24_第1张图片

输入: [1,2,3,null,5,null,4]
输出: [1,3,4]

示例 2:

输入: [1,null,3]
输出: [1,3]

示例 3:

输入: []
输出: []

第一次提交的错误思路:我以为只要一直往右走就行,但是一直往右走的那条路径不一定是深度最大的路径。

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def rightSideView(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        def nextLevel(root, rightView):
            rightView.append(root.val)
            if root.right:
                nextLevel(root.right, rightView)
            elif root.left:
                nextLevel(root.left, rightView)
        rightView = []
        if root:
            rightView.append(root.val)
            if root.right:
                nextLevel(root.right, rightView)
            elif root.left:
                nextLevel(root.left, rightView)
        return rightView

 

参考题解:

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def rightSideView(self, root):
        """
        :type root: TreeNode
        :rtype: List[int]
        """
        everyLevel_right = dict()
        max_depth = -1
        queue = deque([(root, 0)])
        while queue:
            node, depth = queue.popleft()
            if node:
                max_depth = max(depth, max_depth)
                # 按照深度更新结点值,最后更新的就是该层最右侧结点
                everyLevel_right[depth] = node.val
                if node.left:
                    queue.append((node.left, depth + 1))
                if node.right:
                    queue.append((node.right, depth + 1))
        return everyLevel_right.values()

Python算法练习 10.24_第2张图片

 leetcode 1161 最大层内元素和

给你一个二叉树的根节点 root。设根节点位于二叉树的第 1 层,而根节点的子节点位于第 2 层,依此类推。

请返回层内元素之和 最大 的那几层(可能只有一层)的层号,并返回其中 最小 的那个。

示例 1:

Python算法练习 10.24_第3张图片

输入:root = [1,7,0,7,-8,null,null]
输出:2
解释:
第 1 层各元素之和为 1,
第 2 层各元素之和为 7 + 0 = 7,
第 3 层各元素之和为 7 + -8 = -1,
所以我们返回第 2 层的层号,它的层内元素之和最大。

示例 2:

输入:root = [989,null,10250,98693,-89388,null,null,null,-32127]
输出:2

 也是广度搜索,创建一个字典存储层号和对应的和

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution(object):
    def maxLevelSum(self, root):
        """
        :type root: TreeNode
        :rtype: int
        """
        levelSum = dict()
        queue = deque()
        queue.append((root, 1))
        while queue:
            node, depth = queue.popleft()
            if depth not in levelSum: # 不能写成levelSum[depth] is None 因为这个时候键还没有 肯定没有值
                levelSum[depth] = node.val
            else:
                levelSum[depth] += node.val
            if node.left:
                queue.append((node.left, depth + 1))
            if node.right:
                queue.append((node.right, depth + 1))
        maxLevel = 1
        sumList = levelSum.values()
        maxSum = sumList[0]
        for i in range(len(sumList)):
            if maxSum < sumList[i]:
                maxSum = sumList[i]
                maxLevel = i + 1
        return maxLevel

Python算法练习 10.24_第4张图片 

你可能感兴趣的:(算法练习,python,算法)