以下のコードは、黒いツリーのルートから左下のノードを横切って黒ノードを数えたものです。黒のノードの数は可変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の方が良い方法ですか?
このコードで再帰は見られませんか? Btw、改行の後に '.count()'を入れたい。 – Bergi
@Bergi:あなたは再帰について正しい。再帰呼び出しはありません。私は混乱しているので、質問を編集して削除しました。 –
'generateSequence'が最初に見つかったヌルで停止するため、' takeWhile'は不要です。 'filter {} .count()'は 'count {}'と等価です。 – Ilya