Swift - Binary Trees(Data Structure)
11051 ワード
Binary Trees
二元ツリーは、最大2つの参照ノードからなるツリー構造です.
データ構造は、ノードや参照(たとえば、既存のツリー)からなる周期の影響を受けませんが、ツリーは参照の数を決定しません.
バイナリツリーには条件があります.
すべてのノード
左側のサブノードの[小さい](Left Sub)値
右側のサブノードの「より大きい」値
与えなければならない.
これらの条件がすべて満たされている場合にのみ、バイナリプローブツリーが生成されます.それ以外は
ノードの値は重複しません.
ノードの価値は外来ではない.
まだ2つの条件があります.
このGifをよく見れば理解できる
ソース:(https://blog.penjee.com/5-gifs-to-understand-binary-search-tree/#binary-search-tree-insertion-node)
では,SWIFTを用いてバイナリナビゲーションツリーを実現する.class BinaryNode<Element> {
var value : Element
var leftChild : BinaryNode?
var rightChild : BinaryNode?
init ( _ value : Element) {
self.value = value
}
}
classを定義する場合、Elementを使用してすべてのデータを受信します.
あと前の条件はvalueが傍観者になれないのでNon Option
では、行う前に、順番がどのように働いているのかを理解しておきましょう.
ツリーの場合は、次の順になります.
0 - 1 - 5 - 7 - 8 - 9
このように行います
最初のルートユーザ7から、まずleftChildに0でアクセスする.
これにより、ノードの親ノード1にアクセスし、右側の5にアクセスできます.
左側のアクセスが完了するとrootに戻ります.その後右8->彼の両親9
彼らに近づく
コードを見てみましょう.extension BinaryNode {
func traverseInOrder(visit : (Element) -> Void) {
//재귀
leftChild?.traverseInOrder(visit: visit)
visit(value)
rightChild?.traverseInOrder(visit: visit)
}
}
以上のコードは再帰的に実行できます.
では、値を代入して出力します.let ten = BinaryNode(10)
let nine = BinaryNode(9)
let one = BinaryNode(1)
let two = BinaryNode(2)
let three = BinaryNode(3)
let four = BinaryNode(4)
let six = BinaryNode(6)
ten.leftChild = two
ten.rightChild = nine
nine.leftChild = one
nine.rightChild = three
two.leftChild = four
two.rightChild = six
こんな風にクリスマスツリーを作ると
こんな木ができました.
関数出力値を使用します.
正常に動作.
ここでの問題は、ルートノードまたは親ノードを介してchildにアクセスできることです.
では、この問題を補う方法で.
これは、真ん中から根を通って左から右、最後に根に着くのではなく、左から右の方法です. func traversePostOrder(visit : (Element) -> Void) {
leftChild?.traversePostOrder(visit: visit)
rightChild?.traversePostOrder(visit: visit)
visit(value)
}
印刷してみます.
もう一つは船東門めぐりというもの.
これは根からずっと下を向いていることを意味します. func traversePreOrder(visit : (Element) -> Void) {
visit(value)
leftChild?.traversePreOrder(visit: visit)
rightChild?.traversePostOrder(visit: visit)
}
Binary Search Trees
バイナリ検索ツリー(BST)は、バイナリ検索ツリーとして機能する.
例を挙げて説明しましょう.
最初のROOTで動物かどうかを尋ねるそして答えによる.
左と右に分かれます.
動物でなければ岩になり、動物であれば毛の有無を聞かれます.
各特定のノードは、以下の内容を表すTreeノードです.
これにより、「はい」または「いいえ」の2つの質問に答えるだけで、すぐに結果を確認できます.
これには、検索結果をすばやく検索できるという利点があります.
Case Study - Array vs BST
上はアレイアレイ
次はBST
この二つで比較してみる
まず、各アレイを比較し、線形検索を行う必要があります.
また,アイテム数が増えるにつれて配列の検索時間も長くなる.
では、BSTの様子を見てみましょう.
たとえば、105の値を探すとします.
BSTはrootに基づいてタスクを実行します.
必要な値-105はrightにあります.rootより大きい値であることは当然です.
左側は検索する必要はありません.
だから半分の時間を減らしました
私たちは質問にしか答えません.105は77より大きい価格ですか?答えが正しい場合は、必要な値を見つけることができます.値段がもう少し安くても.
Insert
また、挿入する場合も比較します.
配列にsortを使用して0を挿入する場合.
int型Arrayなので、0の値は自然に最初の要素として位置づけられます.
しかし、実際には、0を挿入するために、他の要素はすべて後方に移動します.
これにより、特定のアレイの複雑さが増大します.
しかしBSTではどうなるのでしょうか?
いくつかの質問に答えればいいです.
rootに対して0は40未満です.
これで18と0の値を左に比較できます.
回答に従って、左側に移動し、最後の質問に答えます.
それなら.
簡単ですよね?
Remove
removeもそうです.配列は、消去する値を消去し、残りの要素を適切な位置に移動します.これにより、複雑さが増します.
BSTは枝を切るだけでいいです.
次にBSTの実装について議論する.
Reference
この問題について(Swift - Binary Trees(Data Structure)), 我々は、より多くの情報をここで見つけました
https://velog.io/@leejinseong9410/Swift-Binary-TreesData-Structure
テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol
class BinaryNode<Element> {
var value : Element
var leftChild : BinaryNode?
var rightChild : BinaryNode?
init ( _ value : Element) {
self.value = value
}
}
extension BinaryNode {
func traverseInOrder(visit : (Element) -> Void) {
//재귀
leftChild?.traverseInOrder(visit: visit)
visit(value)
rightChild?.traverseInOrder(visit: visit)
}
}
let ten = BinaryNode(10)
let nine = BinaryNode(9)
let one = BinaryNode(1)
let two = BinaryNode(2)
let three = BinaryNode(3)
let four = BinaryNode(4)
let six = BinaryNode(6)
ten.leftChild = two
ten.rightChild = nine
nine.leftChild = one
nine.rightChild = three
two.leftChild = four
two.rightChild = six
func traversePostOrder(visit : (Element) -> Void) {
leftChild?.traversePostOrder(visit: visit)
rightChild?.traversePostOrder(visit: visit)
visit(value)
}
func traversePreOrder(visit : (Element) -> Void) {
visit(value)
leftChild?.traversePreOrder(visit: visit)
rightChild?.traversePostOrder(visit: visit)
}
バイナリ検索ツリー(BST)は、バイナリ検索ツリーとして機能する.
例を挙げて説明しましょう.
最初のROOTで動物かどうかを尋ねるそして答えによる.
左と右に分かれます.
動物でなければ岩になり、動物であれば毛の有無を聞かれます.
各特定のノードは、以下の内容を表すTreeノードです.
これにより、「はい」または「いいえ」の2つの質問に答えるだけで、すぐに結果を確認できます.
これには、検索結果をすばやく検索できるという利点があります.
Case Study - Array vs BST
上はアレイアレイ
次はBST
この二つで比較してみる
まず、各アレイを比較し、線形検索を行う必要があります.
また,アイテム数が増えるにつれて配列の検索時間も長くなる.
では、BSTの様子を見てみましょう.
たとえば、105の値を探すとします.
BSTはrootに基づいてタスクを実行します.
必要な値-105はrightにあります.rootより大きい値であることは当然です.
左側は検索する必要はありません.
だから半分の時間を減らしました
私たちは質問にしか答えません.105は77より大きい価格ですか?答えが正しい場合は、必要な値を見つけることができます.値段がもう少し安くても.
Insert
また、挿入する場合も比較します.
配列にsortを使用して0を挿入する場合.
int型Arrayなので、0の値は自然に最初の要素として位置づけられます.
しかし、実際には、0を挿入するために、他の要素はすべて後方に移動します.
これにより、特定のアレイの複雑さが増大します.
しかしBSTではどうなるのでしょうか?
いくつかの質問に答えればいいです.
rootに対して0は40未満です.
これで18と0の値を左に比較できます.
回答に従って、左側に移動し、最後の質問に答えます.
それなら.
簡単ですよね?
Remove
removeもそうです.配列は、消去する値を消去し、残りの要素を適切な位置に移動します.これにより、複雑さが増します.
BSTは枝を切るだけでいいです.
次にBSTの実装について議論する.
Reference
この問題について(Swift - Binary Trees(Data Structure)), 我々は、より多くの情報をここで見つけました https://velog.io/@leejinseong9410/Swift-Binary-TreesData-Structureテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol