Implementasi Tree di Golang (dalam kasus ini adalah aplikasi seperti MLM)

Ari Nurcahya
4 min readSep 20, 2020

di minggu pagi yang cerah ini saya pengen nulis. dengan saya menulis saya harapkan apa yang sudah saya kerjakan bisa saya baca besok — besok lagi biar tidak lupa. saya ini soalnya orangnya pelupa, apalagi untuk task yang saya kerjakan sangat jarang sekali, atau kasus sekarang membuat tree yang mungkin ini bisa saja jadi projek saya sekali dalam seumur hidup. mungkin kalo gk saya tulis tahun depan saya sudah tidak ingat lagi caranya, apalagi jika saya sudah tidak punya source code tersebut. misalnya ketika laptop saya ke format ataupun saya sudah tidak bisa clone repositorynya. oleh karena itu saya ingin menulis tulisan “Implementasi Tree di Golang (dalam kasus ini adalah aplikasi seperti MLM)”. saya harap tulisan ini bermanfaat.

tree adalah data structure yang basiknya adalah array, ataupun list. ketika kita membicarakan array maka dia memiliki sisi kanan sebanyak satu dan sisi kiri juga sebanyak satu.

array

contohnya pada gambar diatas. array pada rootnya hanya memiliki sisi kanan saja tidak memiliki sisi kiri dan setiap sisi hanya dihubungkan dengan satu sisi saja.

binary tree

berbeda dengan tree, dalam tree dapat menampung sisi kanan dan sisi kiri yang mana data yang ditampung di sisi kanan maupun kiri dapat lebih dari 1. pada contoh gambar diatas adalah binary tree, dimana pada binary tree tersebut hanya memiliki sisi kanan kiri sebanyak 1. berbeda ketika kita membicaraan tree pada mlm

pada tree di mlm satu user dapat memiliki n jumlah anak. misalkan saya jadi seorang agent mlm, saya pasti dapat mendaftarkan n jumlah user. dan user yang saya daftarkan menjadi anak saya.

dari kasus diatas maka saya akan membuat data structure tree tresebut seperti dibawah ini

pertama saya mengimplementasikan models.Agent. kemudian saya membuat Children yang mana itu adalah yang menunjukan tree yang akan dimiliki oleh data tersebut. jika dijadikan json maka ekspetasi yang akan dihasilkan kurang lebih seperti gambar dibawah ini

tetapi yang menjadi masalah adalah ketika kita fetching data dari database, data yang menjadi pointing untuk menunjukan child dan parent dari data tersebut hanyalah relasi ke data yang menjadi child atau parentnya

yang menjadi masalah terutama jika menggunakan database mysql adalah data hasil fetchingnya adalah seperti itu. maka kita harus memodelkan data yang sudah kita dapatkan agar menjadi bentuk json tree seperti diatas.

kodingan untuk memodelkan data json dari db menjadi json tree seperti gist dibawah ini

keterangan:

  1. Kita harus mengambil data parentnya.

agentParent = repo.AgentRepository.FindByRefCode(refCode)

2. setelah data parent sudah didapatkan kita harus menfetch data child level-1 nya terlebih dahulu.

agents = repo.AgentRepository.FindAll(refCode, “”, “”)

3. setelah itu push parent ke variabel tree nya

trees = dto.AgentTree{ agentParent, nil, }

4. jika sudah di push parentnya kemudian kita push children nya

for _, agent := range agents {

trees.Children = append(trees.Children, &dto.AgentTree{ agent, nil, }). treeDeepInterface[agent.RefCode] = 1

}

nah disitu kan ada treeDeepInterface[agent.RefCode] = 1, variabel ini berguna untuk menunjukan sudah sedalam apa level tree yang berhasil dibuat.

5. kemudian children tersebut kita assign ke variabel queue

queue := trees.Children

6. selanjutnya kita lakukan for loop selama queue masih lebih dari 0.

7. nah selanjutnya kita buat satu variabel lagi namanya nextUp yang mana isinya kita ambil dari variabel queue index ke-0, dan kita assign lagi data dari variabel queue kita sebelumnya dari index ke-1 hingga ke-n

nextUp := queue[0]

queue = queue[1:]

8. karena tree level yang saya buat di aplikasi ini maksimal adalah 5, maka saya akan mengecek apakah level nya sudah 5 atau belum. oleh karena itu sebelumnya saya membuat variabel treeDeepInterface, variabel ini berguna untuk melakukan checking apakah level yang didapatkan dari satu cabang tersebut sudah 5 atau. dan disini saya menceknya dengan menggunakan looping

for _, total := range treeDeepInterface {

if total == 5 {

haveChild = false

break

}

haveChild = true

}

9. langkah selanjutnya tinggal fetching data dari db. kemudian di push ke dalam tree yang sudah dibuat.

10. langkah terakhir masukan children ke variabel queue.

--

--