2017-03-28 14 views
0

私はk-ary木を持っています。木が構築されたら、ノードの深さを計算する必要があります。k-ary木のあるノードの深さを見つける

はここで木のクラスは

public class DirectoryTree implements Serializable { 

    private TreeNode Root; 
    private int numNodes; 
    private TreeNode Focus; 
    private LocalDateTime date; 
    private long totalSizeOnDisk; 

だ相続人のTreeNodeクラス:

public class TreeNode implements Serializable{ 

    private FileSystemEntry data; 
    private boolean directory; 
    private TreeNode parent; 
    private ArrayList<TreeNode> children; 
    private int numChildren; 
    private int nodeKey; 
    private int depth; 

は、私のオリジナルのアイデアは、幅優先順にツリーのすべてのノードをキューすることだった、とnumNodes変数を使用して与えられた節点の子をポップオフして、カウンタの変数が何であってもそれらの深さを設定しますが、それ以来、子どもの深さを見つけるためにポップされたノードを読み取ることはできません。だから、私は再帰的なアルゴリズムなどが必要なようです。たぶん、最初の修正幅:?この

のケース誰つまずくで

public void BFTree() { 

    Queue<TreeNode> queue = new LinkedList<TreeNode>(); 
    queue.add(this.Root); 
    TreeNode current; 
    while ((current = queue.poll()) != null) { 
     BFTree(current, queue); 
    } 
} 

private void BFTree(TreeNode n, Queue<TreeNode> queue) { 

    System.out.println(n.getData().getName()); 
    if (n.isDirectory()) { 
     for (int i = 0; i < n.getChildren().size(); i++) { 
      queue.add(n.getChildren().get(i)); 
     } 
    } 
} 
+0

最初に深さまたは幅のいずれかを検索できます。重要な点は、ノードの深さを計算する必要がある場合、常に親の深さにアクセスできることです。これを達成する方法はたくさんあります。 – Gene

+0

深さの最初の検索...再帰呼び出しを行うと、親の深さ+ 1を渡して次の深度レベルを設定します。 – mba12

+0

ああ、それは意味をなさないです...私はちょうど再帰的に各ノードにアクセスし、深さの親+ 1を作るでしょう。助けてくれてありがとう – Richardweber32

答えて

0

は、私はちょうどこれと私の幅優先トラバーサルを変更:

if(!n.equals(this.Root)){ 
     n.setDepth(n.getParent().getDepth() + 1); 
} 

明らかに与えられたノードの深さがちょうどそのあります親の深さ+ 1.ルートは親を持たないので、アクセス/基底関数の関数では0と定義しただけです。

関連する問題