📜  左右遍历所有二叉树(1)

📅  最后修改于: 2023-12-03 15:39:22.760000             🧑  作者: Mango

左右遍历所有二叉树

在二叉树的遍历中,常用的有三种遍历方式:前序遍历、中序遍历、后序遍历。这三种遍历方式分别对应着先处理根结点、中处理根结点和后处理根结点。除此之外,还有一种遍历方式,叫做左右遍历(也叫“之”字形遍历)。

左右遍历是一种层次遍历的方式,与传统的层次遍历不同的是,左右遍历是按照“之”字形来依次遍历各个节点的。这样遍历得到的结果是一条倾斜的线。

下面我们来介绍一下如何实现左右遍历所有的二叉树。

算法思路

左右遍历的算法思路很简单,其实就是借助队列来实现层次遍历,并且通过维护一个flag变量来控制遍历方向。

具体来说,我们可以按照以下的方式进行遍历:

  1. 创建一个队列,并将根节点入队。
  2. 创建一个变量flag,用于表示当前遍历方向,初始化为true。
  3. 当队列不为空时,循环执行以下步骤:
    1. 创建一个数组level,用于存放当前层次的节点。
    2. 循环遍历队列中的元素,将其依次出队,并将其左右子节点入队。
    3. 根据遍历方向,将遍历到的节点依次加入level数组中。
    4. 将level数组加入结果数组中,并将flag取反。
  4. 返回结果数组。
代码实现

下面是左右遍历所有二叉树的实现代码:

def zigzagLevelOrder(root: TreeNode) -> List[List[int]]:
    if not root:
        return []

    res, q, flag = [], deque([root]), True
    while q:
        level = []
        for _ in range(len(q)):
            node = q.popleft()
            if flag:
                level.append(node.val)
            else:
                level.insert(0, node.val)
            if node.left:
                q.append(node.left)
            if node.right:
                q.append(node.right)
        res.append(level)
        flag = not flag

    return res

其中,TreeNode定义如下:

class TreeNode:
    def __init__(self, val=0, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
总结

左右遍历是一种特殊的层次遍历方式,其实现方法与普通的层次遍历非常相似,主要区别在于维护了一个flag变量来控制遍历方向。在实际应用中,左右遍历可以用于各种需要沿着路径依次遍历节点的场合,比如树的路径和、树的直径等问题的求解。