颜色标记法
Python
在 LeetCode 94的一篇文章看到了进行树的深度遍历的方法。效果是:无论是前序中序后序都是一样的写法。这种方法被作者称为“颜色标记法”。作者为:hzhu212,原文地址
这里直接附上原作者的思路分析:
其核心思想如下:
- 使用颜色标记节点的状态,新节点为白色,已访问的节点为灰色。
- 如果遇到的节点为白色,则将其标记为灰色,然后将其右子节点、自身、左子节点依次入栈。
- 如果遇到的节点为灰色,则将节点的值输出。
中序遍历
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