📅  最后修改于: 2023-12-03 15:39:22.760000             🧑  作者: Mango
在二叉树的遍历中,常用的有三种遍历方式:前序遍历、中序遍历、后序遍历。这三种遍历方式分别对应着先处理根结点、中处理根结点和后处理根结点。除此之外,还有一种遍历方式,叫做左右遍历(也叫“之”字形遍历)。
左右遍历是一种层次遍历的方式,与传统的层次遍历不同的是,左右遍历是按照“之”字形来依次遍历各个节点的。这样遍历得到的结果是一条倾斜的线。
下面我们来介绍一下如何实现左右遍历所有的二叉树。
左右遍历的算法思路很简单,其实就是借助队列来实现层次遍历,并且通过维护一个flag变量来控制遍历方向。
具体来说,我们可以按照以下的方式进行遍历:
下面是左右遍历所有二叉树的实现代码:
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变量来控制遍历方向。在实际应用中,左右遍历可以用于各种需要沿着路径依次遍历节点的场合,比如树的路径和、树的直径等问题的求解。