二叉树的层序遍历 - 灵神视频总结

这节课讲了二叉树的层次遍历 , 就是一层层的遍历。

关于二叉树相关的文章:

  1.  看到递归就晕?带你理解递归的本质!-- 灵神视频总结-CSDN博客
  2. 如何灵活运用递归?- 灵神视频总结-CSDN博客
  3. 二叉树的最近公共祖先 - 灵神视频总结-CSDN博客

这节课讲了二叉树的层次遍历 , 就是一层层的遍历。

可以设置两个数组, cur 用来存储第一层,nxt 用来存储下一层的节点。

只要cur 不为空,就需要存储当前节点的值,并把下一层的节点存储在nxt中。 当一次循环结束之后,需要把cur = nxt,继续遍历,知道所有的节点都遍历完。

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        ans = []
        if root is None:
            return []
        cur = [root]
        while cur : 
            nxt = []
            vals = []
            for node in cur:
                vals.append(node.val)
                if node.left: nxt.append(node.left)
                if node.right: nxt.append(node.right)
            cur = nxt
            ans.append(vals)
        return ans 

那有个问题哈, cur nxt 能不能合并成一个数组呢? 这种结构就是先进先出的结构。这种数据结构叫队列,python中使用 deque来实现。 代码也很简单,就是需要熟悉deque的两个函数, popleft(), append(), 把节点移除和添加新的节点。

这里值得说明的是,BFS算法一般都可以使用队列才操作。不管是二叉树还是多叉树。

代码:

# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def levelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        ans = []
        if root is None:
            return []
        q = deque([root])
        while q : 
            vals = []
            for _ in range(len(q)):
                node = q.popleft()
                vals.append(node.val)
                if node.left: q.append(node.left)
                if node.right: q.append(node.right)
            ans.append(vals)
        return ans 

103. 二叉树的锯齿形层序遍历

和上一题一样, 只不过是偶数层要反转一下,设置一个even变量即可,如果even = True, 直接反转数组。

时空复杂度都是O(n)

python 反转数组为 vals[::-1]

代码

# Definition for a binary tree node.
class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
class Solution:
    def zigzagLevelOrder(self, root: Optional[TreeNode]) -> List[List[int]]:
        ans = []
        if root is None:
            return []
        q = deque([root])
        even = False
        while q : 
            vals = []
            for _ in range(len(q)):
                node = q.popleft()
                vals.append(node.val)
                if node.left: q.append(node.left)
                if node.right: q.append(node.right)
            ans.append(vals[::-1] if even else vals)
            even = not even
        return ans 

513. 找树左下角的值

其实就是找到最后一层的第一个节点即可。

# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def findBottomLeftValue(self, root):
        # 节点最少为1个, 不需要判别空。
        ans = []
        q = deque([root])
        while q: 
            vals = []
            for _ in range(len(q)):
                node = q.popleft()
                vals.append(node.val)
                if node.left : q.append(node.left)
                if node.right : q.append(node.right)
            ans.append(vals)
        print(ans)
        print(vals)
        return ans[-1][0]

视频给了另外一种解法

把入队的顺序变成从右向左,最后一个节点节点即是第一个节点;

这种做法在右视图中也经常用的到。

# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def findBottomLeftValue(self, root: Optional[TreeNode]) -> int:
        q = deque([root])
        while q:
            node = q.popleft()
            if node.right: q.append(node.right)
            if node.left: q.append(node.left)
        return node.val

   系列文章 

  1.  三数之和 - 灵神视频总结。-CSDN博客 
  2. 盛最多水的容器 接雨水 - 灵神视频总结-CSDN博客
  3. 滑动窗口 模版 - 灵神视频总结-CSDN博客
  4. 二分查找 红蓝染色法 - 灵神视频总结-CSDN博客
  5. 二分查找 数组峰值 旋转排序数组 - 灵神视频总结-CSDN博客
  6. 反转链表 K个一组反转链表 - 灵神视频总结-CSDN博客
  7. 环形链表 快慢指针 奇偶链表 重排链表 -- 灵神视频总结-CSDN博客
  8. 删除链表重复节点 - 灵神视频总结-CSDN博客
  9. 看到递归就晕?带你理解递归的本质!-- 灵神视频总结-CSDN博客
  10. 如何灵活运用递归?- 灵神视频总结-CSDN博客
  11. 二叉树的最近公共祖先 - 灵神视频总结-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值