binary search tree
August 8, 2020 · View on GitHub
2020/08/08
構造体
struct 構造体名 {
// 非公開 イミュータブル (デフォルト)
member1 type
member2 type
// アクセス指定子
mut: // 非公開 ミュータブル
pub: // 公開 イミュータブル (読み取り専用)
pub mut: // 公開 親モジュールでのみミュータブル
__global: // 公開かつ親モジュールの内側でも外側でもミュータブル(非推奨)
}
初期化(仮)
よくわかっていない
int(0)
Node(0)
ポインタ
宣言
&変数
アドレスを見る
ptr_str(Node) // return string
0で初期化できる
参考:calculator.v
配列
arr := [1,2,3,4,5,6,7,8,9]
arr := []type{} // 初期化
引数で受け取る & 返り値
fn function(arr []int) []int {
mut new_arr := [3,3,3]
new_arr << arr
return new_arr
}
アクセス
arr[idx]
arr.len // arr.size
arr.first() // arr[0]
arr.last() // arr[arr.len-1]
push
arr << num
pop
fn pop(arr []int) (int, []int) {
return arr.last(), arr[0..arr.len-1]
}
unshift
fn unshift(arr []int, data int) []int {
mut res := [data]
res << arr
return res
}
shift
fn shift(arr []int) (int, []int) {
return arr.first(), arr[1..arr.len]
}
二分探索木
/*
構造体でNodeを宣言
valueは変わらないモノとしてみる
*/
struct Node {
value int
pub mut:
left &Node = 0 // 初期化
right &Node = 0 // 初期化
}
/*
Node Objectを作る
ヒープ領域に展開したいのでポインタを返す
*/
fn generate_node(val int) &Node {
return &Node{value:val}
}
// 値を挿入する
fn (n &Node) insert(data int) {
mut current := n
new_node := generate_node(data)
for {
if current.value > data {
if current.left == 0 {
current.left = new_node
return
} else {
current = current.left
}
} else {
if current.right == 0 {
current.right = new_node
return
} else {
current = current.right
}
}
}
}
// 幅優先探索
fn (root &Node) bfs() []int {
mut data := []int{}
mut queue := [root]
mut n := &Node(0) // `mut n := 0`だとエラーになる
/*
上記のshift()でやると`Unhandled Exception 0xC0000374`と出るのでindexで管理
*/
mut idx := 0
for queue.len > idx {
n = queue[idx]
data << n.value
if n.left != 0 {
queue << n.left
}
if n.right != 0 {
queue << n.right
}
idx++
}
return data
}
fn main() {
mut nums := [44, 56, 17, 98, 11, 3, 70, 8]
mut root := generate_node(nums[0])
for i in 1..nums.len {
root.insert(nums[i])
}
elms := root.bfs()
println(elms) // [44, 17, 56, 11, 98, 3, 70, 8]
}