用于计算AbstractTree深度的访问者(模式)

时间:2018-04-13 09:03:54

标签: design-patterns visitor visitor-pattern

我在大学里有这样的任务来写一个访问者,它计算了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)时,我知道如何执行此任务,但在这种情况下,访问者几乎不了解树结构(必须这样,任务就像这样制定)。

1 个答案:

答案 0 :(得分:0)

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

  • 树有一个根,因此访问的第一个节点的深度为0
  • 每个节点的两个孩子的深度为+ 1

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

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