2017-10-24 12 views
2

私は、Rに制約される単純な問題があります。効率的なバイナリツリーがあります。おもちゃの例が表示されていますhere.
本質的に、私は最大の深さの葉の間で操作を行います(深さの繋がりでは、順序は関係ありません)。私はそれをここに加えましたが、実際にはもっと複雑な式につながっています。
私のコードではRに制限されています。私は他の手段を介してそれを得るのにこの構造は、このコマンドで表すことができます。Rネストされたリストを単純なバイナリツリーとして使用する

testBranch<-list(list(list(list(20,15),40),list(10,30)),5) #Depth of 4

私は最も深いレベルがどの程度深いかを決定するための作業機能を持っていますが、Rでネストされたリストが遠くなるようなされています。どのように効率的にのインデックスを見つけるためにどのように手がかりは、最も深い値にアクセスする?例えば、

testBranch[[1]][[1]][[1]]

上記玩具の例では、私が好きなものを2つの要素を含むリストを、私を与えるだろう。私は

testBranchStep1<-list(list(list(35,40),list(10,30)),5)

:でRで表すことができtoy example,でステップ1に対応するツリーに結果の

indexesOI<-getIndexes(testBranch) testBranch[indexesOI]<-testBranch[indexesOI][1]+testBranch[indexesOI][2] #testBranch now has depth of 3

:私のほかの例を使用して、私は、これを行うことができます必要に応じて、パッケージを使用することができます。私はクラスシステムの経験があまりないので、Rでノードクラス/ dfs全体を書き直すのではない。私はdata.treeを調べましたが、ネストされたリストをデータ構造体に強制的に運ぶことはありませんでした。

あなたが提供できるヘルプは素晴らしいでしょう!急いで作られたASCIIツリーを許してください。私は大部分が独学で、ここでは多くの質問をしていないので、フォーマットを調整する必要がある場合は私にも教えてください!ありがとう!

答えて

1

を知らないので、ここでは擬似コードで再帰関数は、あなたがdata.treeでこれを行うことができます。

library(data.tree) 
testBranch <- list(list(list(list(20,15),40),list(10,30)),5) 
tree <- FromListSimple(testBranch) 
tree 

これはツリーを出力します:

 levelName 
1 Root   
2 °--1   
3  ¦--1  
4  ¦ °--1 
5  °--2 

data.tree(あなたはビネットを読んで確認してください)多くのユーティリティ関数とプロパティを提供します。

height <- tree$height 

得どちら:

> 4 

をあなたは、ツリーをトラバースし、最大の高さを持つノードを見つけることができます。

maxDepthLeaves <- Traverse(tree, filterFun = function(node) node$level == height) 

この深さを知るためには、具体的には、これを使用しますトラバーサルは、最大レベルのノードのリストです(この場合はNodeのみです)。次に、Getを使用して、トラバーサルから任意の値を取得することができます。 nameposition、またはpathString:私ははるかに前にこれを得ている

  1 
"Root/1/1/1" 
+0

Get(maxDepthLeaves, 'pathString') 

はとして表示します。それ以来もっと多くのことをしてきた私は、私の質問に記載されているように、その深さで葉にパス/インデックスを取得する方法をまだ考え出していない:> _Any手掛かりどのように効率的にインデックスのセットを見つけるために、 ?_すべてのブランチを手作業でループせずにdata.tree構造を利用する方法を知っていますか?私の質問の心は、最も深い葉の位置を知ることに関係しています。これまでにありがとうございました! –

+0

パーフェクト。どうもありがとうございます。何らかの点でネイティブリストを使用するスマートな方法を見つけたいと思っていますが、これは私の目的にとってはうまくいきます!方法を見つけたらすぐに答えとしてマークします。 –

0

あなたが途中にいるようなサウンドです。最も深いノードが見つかるたびに、インデックスをリストに出力できます。私はR.

If tree is a leaf node 
    If current depth is greater than max-depth 
     Delete list of indices 
     Append current index into list of indices 
    If current depth is equal to max-depth 
     Append current index into list of indices 
Else 
    for each element in the tree 
     Get current index 
     Recursively call this function, passing in the current index 
関連する問題