これは Java プログラマーの間で激しく議論され、物議を醸すトピックであることは認識していますが、私の問題はやや独特だと思います。私のアルゴリズムは、参照渡しが必要です。仮想(x、y)座標を割り当てるために、一般的なツリー(つまり、n-children)の時計回り/反時計回りの事前注文トラバーサルを行っています。これは単純に、訪問したツリーのノードをカウント (およびタグ付け) することを意味します。
/**
* Generates a "pre-ordered" list of the nodes contained in this object's subtree
* Note: This is counterclockwise pre-order traversal
*
* @param clockwise set to true for clockwise traversal and false for counterclockwise traversal
*
* @return Iterator<Tree> list iterator
*/
public Iterator<Tree> PreOrder(boolean clockwise)
{
LinkedList<Tree> list = new LinkedList<Tree>();
if(!clockwise)
PreOCC(this, list);
else
PreO(this,list);
count = 0;
return list.iterator();
}
private void PreOCC(Tree rt, LinkedList<Tree> list)
{
list.add(rt);
rt.setVirtual_y(count);
count++;
Iterator<Tree> ci = rt.ChildrenIterator();
while(ci.hasNext())
PreOCC(ci.next(), list);
}
private void PreO(Tree rt, LinkedList<Tree> list, int count)
{
list.add(rt);
rt.setX_vcoordinate(count);
Iterator<Tree> ci = rt.ReverseChildrenIterator();
while(ci.hasNext())
PreO(ci.next(), list, ++count);
}
ここで、ツリーの構造を生成します。
Tree root = new Tree(new Integer(0));
root.addChild(new Tree(new Integer(1), root));
root.addChild(new Tree(new Integer(2), root));
root.addChild(new Tree(new Integer(3), root));
Iterator<Tree> ci = root.ChildrenIterator();
ci.next();
Tree select = ci.next();
select.addChild(new Tree(new Integer(4), select));
select.addChild(new Tree(new Integer(5), select));
ノードがトラバースされた順序と、それぞれのノードに割り当てられた座標を出力したときの出力を次に示します。
0 3 2 5 4 1
0 1 2 3 4 3
0 1 2 4 5 3
0 1 2 3 4 3
注: 最初の 2 行は、時計回りの事前順序走査と x 座標の割り当てです。次の 2 行は、反時計回りの事前順序走査と y 座標の割り当てです。
私の質問は、2 行目を読み取る方法です。
0 1 2 3 4 5
編集 1: これは、ノードにアクセスする順序と割り当てた座標を出力するために使用するコードです。
Iterator<Tree> pre = root.PreOrder(true);
System.out.println(" \t");
while(pre.hasNext())
System.out.print(pre.next() + "\t");
pre = root.PreOrder(true);
System.out.println();
System.out.println("x-coordinates:\t");
while(pre.hasNext())
System.out.print(pre.next().getVirtual_x() + "\t");
System.out.println();
System.out.println();
Iterator<Tree> preCC = root.PreOrder(false);
System.out.println(" \t");
while(preCC.hasNext())
System.out.print(preCC.next() + "\t");
preCC = root.PreOrder(false);
System.out.println();
System.out.println("x-coordinates:\t");
while(preCC.hasNext())
System.out.print(preCC.next().getVirtual_y() + "\t");
また、x、y座標をよりよく説明するための引用があります。頂点。頂点の y 座標。
T の頂点の反時計回りの事前順序付け (順序付けには 0 から n − 1 の番号が付けられます) を計算し、それらを頂点の x 座標として使用します。
T の頂点の時計回りの事前順序付け (順序付けには 0 から n − 1 の番号が付けられます) を計算し、それらを頂点の y 座標として使用します。