访问者(模式)来计算 AbstractTree 深度

Visitor (pattern) to compute AbstractTree depth

我在大学有这样一个任务,要编写一个访问者,它计算 AbstractTree 的深度。这是树:

public abstract class AbstractTree {
    public abstract void Accept(AbstractVisitor abstractVisitor);
}

public class Leaf : AbstractTree {
    public override void Accept(AbstractVisitor visitor) {
        visitor.VisitLeaf(this);
    }
}

public class Node : AbstractTree {
    private AbstractTree Left { get; set; }
    private AbstractTree Right { get; set; }

    public Node(AbstractTree left, AbstractTree right) {
        Left = left;
        Right = right;
    }

    public override void Accept(AbstractVisitor visitor) {
        visitor.VisitNode(this);

        if (Left != null)
            Left.Accept(visitor);
        if (Right != null)
            Right.Accept(visitor);
    }
}

和AbstractVisitor:

public abstract class AbstractVisitor {
    public abstract void VisitLeaf(Leaf tree);

    public abstract void VisitNode(Node tree);
}

但是我该如何编写具体的 DepthVisitor?我知道如何执行这个任务,当访问者知道树结构时(depth-computing visitor that knows about the tree structure),但在这种情况下,访问者几乎不了解树结构(它必须知道,任务是这样制定的).

您可以绘制树的某些属性并将每个访问过的节点的深度存储在访问者中。

  • 一棵树只有一个根,所以访问的第一个节点的深度为 0
  • 每个节点的两个children深度+1

您的访问者可以保留(树,深度)对的地图。

  1. 如果当前节点未知,则它必须是根。存储 (root, 0) and (root.Left, 1), (root.Right, 1).
  2. 对于任何其他节点n,从地图中获取节点的深度d(它必须存在,因为已经访问了parent节点)并存储(n.Left,d+1 ), (n.Right, d+1)