2017-10-14 5 views
1

以下のコードは、黒いツリーのルートから左下のノードを横切って黒ノードを数えたものです。黒のノードの数は可変blackに格納されます。手続き型スタイルメソッドを機能スタイルに変換する

fun isBalanced1(): Boolean { 
    require(!isEmpty()) { "Cannot check empty tree for balance"} 
    var x = root 
    var black = 0 
    while(x != null) { 
     if(!isRed(x)) { 
      black++ 
     } 
     x = x.left 
    } 
    return isBalanced(root, black) 
} 

スタイルは手続きであり、それは大丈夫動作します。

今、もっと機能的なスタイルで同じことをどうやって変えることができますか?これは、ノードがnullではなく、その後、黒のものをフィルタリングし、すべての一致をカウントしながら、木を横断するシーケンスジェネレータを使用しています

fun isBalanced1(): Boolean { 
    require(!isEmpty()) { "Cannot check empty tree for balance" } 
    val black = 
      generateSequence(root) { node -> node.left } 
        .takeWhile { node -> node != null } 
        .filter { node -> !isRed(node) }.count() 
    return isBalanced(root, black) 
} 

これは私が思いついたものです。

これは、このツリートラバーサルコードを変換する正しい方法ですか、それともKotlinの方が良い方法ですか?

+1

このコードで再帰は見られませんか? Btw、改行の後に '.count()'を入れたい。 – Bergi

+0

@Bergi:あなたは再帰について正しい。再帰呼び出しはありません。私は混乱しているので、質問を編集して削除しました。 –

+2

'generateSequence'が最初に見つかったヌルで停止するため、' takeWhile'は不要です。 'filter {} .count()'は 'count {}'と等価です。 – Ilya

答えて

0

コメントで与えられたアドバイスに続いて、これはコードは次のようになります方法です。この方法count()

fun isBalanced(): Boolean { 
    require(!isEmpty()) { "Cannot check empty tree for balance" } 
    val blackCount = 
      generateSequence(root) { node -> node.left } 
        .count { !isRed(it) } 
    return isBalanced(root, blackCount) 
} 

は、読みやすくするために、独自の段落にあり、takeWhileは必要ありません。

+0

@Ilyaが次のようにフィルタとマージをマージできます: 'generateSequence(it.left).count {!isRed(it)}' –

関連する問題