ABOUT ME

-

  • V language : Binary Search Tree (BST)
    컴퓨터/V language 2020. 8. 21. 19:53
    728x90
    반응형

    Binary Search Tree

    이진 탐색 트리

    1. 문법 살펴보기

    1. V에는 null type이 없다. (제일 힘들었다.)

     

    2. try/catch/block

    V 언어에서는 try/catch/null이 다 없는데, or 키워드가 있다.

    아래 코드를 보면 user := repo.find~(10) or { 이 있는데,

    이 부분은, 함수를 만들 때 우선 ? 키워드를 사용하여 option type이라고 지정해야 하고,

    사용할 때는 or { // 실패했을 때 // } 와 같이 사용해야한다.

    vlang
    struct User { id int name string } struct Repo { users []User } fn (r Repo) find_user_by_id(id int) ?User { for user in r.users { if user.id == id { // V automatically wraps this into an option type return user } } return error('User $id not found') } fn main() { repo := Repo { users: [User{1, 'Andrew'}, User {2, 'Bob'}, User {10, 'Charles'}] } user := repo.find_user_by_id(10) or { // Option types must be handled by `or` blocks return } println(user.id) // "10" println(user.name) // "Charles" }

     

    2. BST 구현

    1. null 타입을 확인할 수가 없기 때문에, ptr_str (0x0)을 이용했다.

    vlang
    // tree.left ptr_str(0x0) 아니면 true, 맞으면 false a := tree.left.exist()
    vlang
    fn (t &Tree) exist() bool { if t == &Tree(0) { return false } return true }

     

    Full source

    vlang
    struct Tree { value int mut: left &Tree = &Tree(0) right &Tree = &Tree(0) } /* BST (Binary Search Tree) 1. its value is strictly greater than the values of every node to its left 2. its value is less than or equal to the values of every node to its right */ fn main() { mut tree := &Tree{value: 30} // root nodes := [15, 60, 7, 22, 45, 75, 17, 27] for node in nodes { tree.insert(node) } println(tree.value) // 30 println(tree.left.value) // 15 println(tree.left.right.value) // 22 println(tree.left.right.right.value) // 27 println(tree.left.right.left.value) // 17 println(tree.left.left.value) // 7 println(tree.right.value) // 60 println(tree.right.left.value) // 45 println(tree.right.right.value) // 75 } fn (mut t Tree) insert(val int) &Tree { // println(t.str()) if val < t.value { if t.left.exist() { return t.left.insert(val) } else { t.left = &Tree{value: val} } } else { if t.right.exist() { return t.right.insert(val) } else { t.right = &Tree{value: val} } } return t } fn (t &Tree) exist() bool { if t == &Tree(0) { return false } return true } // Node print fn (t &Tree) str() string { return 'Node {\n' + ' value: $t.value\n' + ' left: 0x${ptr_str(t.left)}\n' + ' right: 0x${ptr_str(t.right)}\n' + '}' }

     

    3. 참고

    (개인) Github Algorithms in V language : https://github.com/Alfex4936/V-algorithms

     

    Alfex4936/V-algorithms

    Algorithms in V language. Contribute to Alfex4936/V-algorithms development by creating an account on GitHub.

    github.com

     

    728x90

    '컴퓨터 > V language' 카테고리의 다른 글

    V language : Sleep Sort  (0) 2020.08.22
    V language : Introspective Sort  (0) 2020.08.20
    V language : Insertion Sort  (0) 2020.08.19

    댓글