📅  最后修改于: 2023-12-03 15:27:34.574000             🧑  作者: Mango
给定一棵二叉树, 求此二叉树的左视图中的所有节点的值的和.
左视图的定义: 从根节点出发, 按照从左到右的顺序, 每层只保留一个节点.
示例:
输入:
1
/ \
2 3
/ \
4 5
输出: 7
解释: 左视图是 [1, 2, 4], 其中节点值的和为 7.
先来回顾一下二叉树的遍历方式, 常见的有三种: 前序遍历、中序遍历和后序遍历.
前序遍历指的是从根节点出发, 依次按照 根节点 -> 左子树 -> 右子树 的方式访问每个节点.
中序遍历指的是从根节点出发, 依次按照 左子树 -> 根节点 -> 右子树 的方式访问每个节点.
后序遍历指的是从根节点出发, 依次按照 左子树 -> 右子树 -> 根节点 的方式访问每个节点.
在遍历二叉树的过程中掌握左视图节点的特点: 对于每一层, 只需访问该层中的第一个节点即可.
接下来我们考虑如何求出二叉树的左视图中的节点总和.
对于每一层, 我们只需计算该层第一个节点的值即可. 每计算完一层的第一个节点, 就需要向下遍历下一层, 并记录下一层的各个节点.
类似于层序遍历的过程, 但是我们仅取每一层的第一个节点即可.
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def sumOfLeftView(self, root: TreeNode) -> int:
if not root:
return 0
queue = [root]
left_view_sum = 0
while queue:
left_view_sum += queue[0].val
level_size = len(queue)
for i in range(level_size):
node = queue.pop(0)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
return left_view_sum
时间复杂度: 因为要遍历整个二叉树, 所以时间复杂度为O(n), 其中n为节点数.
空间复杂度: 此算法使用了队列进行节点遍历和存储, 所以空间复杂度为O(n), 其中n为节点数.
此题的解法类似于二叉树的层序遍历, 通过遍历每一层的第一个节点来获取二叉树的左视图中的所有节点.
虽然此题的解法较为简单, 但在实际的面试中能考察到面试者对于二叉树的基本操作和遍历方式掌握的程度.
通过掌握二叉树的遍历方式和左视图节点的特点, 可以快速解决面试中类似的二叉树类问题.