全面解析DFS(必看)

颜色标记法

Python

在 LeetCode 94的一篇文章看到了进行树的深度遍历的方法。效果是:无论是前序中序后序都是一样的写法。这种方法被作者称为“颜色标记法”。作者为:hzhu212,原文地址

这里直接附上原作者的思路分析:

其核心思想如下:

  1. 使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。
  2. 如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈。
  3. 如果遇到的节点为灰色,则将节点的值输出。

中序遍历

class Solution:
    def inorderTraversal(self, root: TreeNode) -> List[int]:
        WHITE, GRAY = 0, 1
        res = []
        stack = [(WHITE, root)]
        while stack:
            color, node = stack.pop()
            if node is None: continue
            if color == WHITE:
                stack.append((WHITE, node.right))
                stack.append((GRAY, node))
                stack.append((WHITE, node.left))
            else:
                res.append(node.val)
        return res

java

对应的,我写了一个 Java 版本的:

中序遍历

enum Color {
   
    WHITE, BLACK
}

public static Map.Entry<Color, TreeNode> createEntry(Color color, TreeNode node) {
   
    return new AbstractMap.SimpleEntry<>(color, node);
}

public static List<Integer> inorderTraversal3(TreeNode root) {
   
    List<Integer> res = new ArrayList<>();
    Stack<Map.Entry<Color, TreeNode>> stack = new Stack<>();
    stack.add(createEntry(Color.WHITE, root));

    while (!stack.isEmpty()) {
   
        Map.Entry<Color, TreeNode> node = stack.pop();
        if (node.getValue() == null) continue;
        if (node.getKey() == Color.WHITE) {
   
            stack.add(createEntry(Color.WHITE, node.getValue
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值