- Last 7 days
-
Local file Local file
-
variable length array yang berisiserangkaian karakter
diperlakukan speerti array yang punya panjang variabel yang berisi serangkaian karakter
-
Mirip dengan String tapi bisa dimodifikasi secarainternalnya
karena string immutable, kalo stringbuilder ga sehingga bisa dimanipulasi
-
Integer.toString(i);String s4 = Double.toString
method konversi ke string
-
int i;String s1 = "" + i;
string kosong + i dan di assign ke String s1 untuk konvert int ke string
-
parseFloat
konversi string -> float ini method static yang dipunyai class Float
-
palindrome.length
panjg kata
-
imuttable
gabisa diubah nilainya, kalo mau diubah maka dibuang dulu objeknya baru dibuat objek baru
-
char[] helloArray = { 'h', 'e', 'l', 'l', 'o', '.’}
buat array of char lalu di assign ke string
-
String greeting = "Hello world!"
langsung
-
-
Local file Local file
-
char toUpperCase(char ch)char toLowerCase(char ch)toString(char ch)
konversi
-
isLowerCase
apakah huruf kecil
-
isUpperCase
apakah huruf besar
-
isWhiteSpace
apakah spasi
-
isDigit
apakah digit 0-9?
-
isLetter
apakah alfabet
-
ch = 'a';
ch object a primitf
nanti compiler akan melakukan boxing a jadi object baru di assign
-
boolean equals(Object obj)
membandingkan current object dengan object yang ada di parameter
-
int compareTo(Byte anotherByte)int compareTo(Double anotherDouble)int compareTo(Float anotherFloat)int compareTo(Integer anotherInteger)int compareTo(Long anotherLong)int compareTo(Short anotherShort)
perbandingan ke int dan hasil nya lebih besar,kecil, dll
-
byte byteValue()short shortValue()int intValue()long longValue()float floatValue()double doubleValue()
menghasilkan value dengan tipe datanya masing2 (disebelah paling kiri)
-
MIN_VALUE atau MAX_VALUE
ini number object juga
-
Wrapper Class
ini ada hierarki nya juga
-
x+y
x dan y tipe objek. penjumlahan hanya bisa dilakukan ke tipe primitf sehingga harus di unboxing dulu, baru bisa dijumlahkan
-
15
ini juga
-
12
ini konstanta primitif di assign ke x yang class Integer, maka harus di boxing sehingga 12 di bungkus ke kelas x, sehingga ga perlu instansiasi new dll
-
primitif yang ada sedangkan objekyang diharapkan maka kompilator akanboxesprimitif
contoh int di wrap ke int, float ke float, dll
-
int i = 500;float gpa = 3.65f;byte mask = 0xff;
karna ketiganya primitif, java menyediakan class untuk ketiganya yaitu Integer
tambahan, float perlu akhiran f karena kalo ngga bakal dianggap double (dan akan error)
-
-
Local file Local file
-
Deer d = new Deer();Animal a = d;Vegetarian v = d;Object o = d;
Intinya: Tanpa baris-baris itu, class Deer tetap: subclass dari Animal implementasi dari Vegetarian subclass dari Object (secara implisit) Baris-baris itu hanya contoh bahwa polimorfisme di Java memungkinkan objek Deer diperlakukan sebagai: Animal Vegetarian Object
-
Dynamic Binding
basically dia akan pilih ngebind ke class yang mana saat runtime pake if else
-
-
Local file Local file
-
Bicycle
bisa instansiasi jadi Bicycle karena ngeextend class itu
-
bike01, bike02, bike03
3 reference ke bicycle.
-
super.printDescription();
manggil dari outerclas
-
public void printDescription(
merupakan method dengan signature yang sama dengan parent classnya
-
Polymorphism
kemampuan sebuah objek untuk memerankan banyak bentuk
-
Subclass
bisa memerankan dirinya sendiri atau parent kelasnya
-
Polymorphism
kemampuan sebuah objek untuk memerankan banyak bentuk
-
-
Local file Local file
-
public abstract class GraphicObject
gamasuk akal kita buat objek graphicobject tanpa tau objeknya apa (persegi atau apa)
-
Kelas Abstrak: kelas yang tidak bisa diinstansiasi
ini biasanya secara logika ada tapi gaada objek yang cocok untuk abstrak kelas tsb.
gabisa dibuat objek untuk kelas ini.
class Mobil { // atribut dan method }
// instansiasi: Mobil m = new Mobil();
-
kelas basisnya merupakan turunan darikelas yang sama
misal ada 2 kelas basis, sebenernya di turunkan dari 2 kelas yang sama. di java gabisa juga?
-
kelas yang diturunkandari 2 atau lebih kelas basis
bahasa java ga mendukung multiple inheritance, bisanya di c++
-
kelas turunan membuatulang (mendefinisikan ulang) method dari kelasbasis
override akan gagal compile kalo ga semua method di redefine
-
bisa memilihkonstruktor kelas basis yang akan dieksekusi
karena bisa saja kelas basis punya konstruktor lebih dari satu
-
super.printMethod(
ini akan manggil method yang dari superclass, kalo bukan main, in heritance emg pake super
super ini kalo bukan dalam main? betul
-
-
Local file Local file
-
implisit
konstruktor yang tidak ber parameter
-
Memanfaatkan atribut kelas basis
karena atribut basis kelas pasti terwarisi ke subclass
-
setHeight
bisa tambah method baru
-
super
untuk meneruskan parameter yang ada dalam kurung ke parent class nya
-
private int seatHeight
field tambahan yang beda dari Bicycle
-
elasturunan “is-a” kelas basis
Misal: mountainbike itu isa/kindof bicycle
-
-
Local file Local file
-
iterator
inner class
-
even
genap
-
Instans inner class hanya exist dalam instansouter class-nya
kita ga mungkin membuat instance inner class tanpa membuat outer class nya
-
Inner class
jatohnya mirip atribut/method dari outer class
-
-
Local file Local file
-
what about this?
ini gabisa karna shapename bukan static
-
can we do this?
bisa karena classname itu atribut static
-
Static Nested Class
- Inner Class Non-Static:
- Kelas ini adalah kelas yang didefinisikan di dalam kelas lain (outer class) dan tidak dideklarasikan sebagai static.
-
Kelas ini memiliki akses ke semua metode dan atribut dari outer class, termasuk yang bersifat private. Artinya, inner class dapat menggunakan dan memodifikasi data dari outer class secara langsung.
-
Static Nested Class:
- Kelas ini juga didefinisikan di dalam kelas lain, tetapi dideklarasikan sebagai static.
- Kelas ini tidak memiliki akses langsung ke metode atau atribut dari outer class, termasuk yang bersifat private. Untuk mengakses data dari outer class, Anda harus membuat objek dari outer class terlebih dahulu.
Secara ringkas, perbedaan utama antara inner class non-static dan static nested class terletak pada aksesibilitas terhadap anggota dari outer class. Inner class non-static memiliki akses penuh, sedangkan static nested class tidak.
-
static nested class diasosiasikandengan outer class-nya
Static variable/method dimiliki oleh class bukan objek
-
enkapsulasi
nested class yang berada dalam class hanya dapat dikenali dalam class tersebut tidak bisa dari class luar
-
NestedClass
kita bisa mendefinisikan kelas dari outer class
-
- Mar 2025
-
Local file Local file
-
ackage-private
default, hanya bisa diakses di package tersebut.
-
protected
diakses class inheritance package yang sama
-
Member level
di atributnya
-
op level: public,package-private
ada satu lagi default.
Top level berarti di tipe class, interface, enum, dll
-
-
Local file Local file
-
d.ac.itb.stei.graphic
kalo dari url dibalik
-
-
Local file Local file
-
pengelompokkan kelas daninterface ke dalam paket
terus disini di satukan dalam satu package
-
Contoh Packages
ini sebelum di masukkan ke package
-
Packages
Ya, package di Java memang mirip dengan konsep library, tapi ada perbedaan penting:
- Package adalah cara untuk mengorganisasi kode dalam proyek Java. Ini lebih seperti "folder" yang mengelompokkan kelas, interface, dll., agar rapi dan modular.
- Library adalah kumpulan package atau kode yang sudah jadi, biasanya digunakan untuk menambahkan fitur tertentu ke proyek. Contoh library di Java adalah JAR file seperti
java.util
atau library eksternal seperti Apache Commons.
Perbedaan utama: - Package: Fokus pada pengorganisasian kode dalam proyek. - Library: Kumpulan package atau kode yang bisa digunakan kembali di berbagai proyek.
Contoh: - Package:
java.util
(berisi kelas sepertiArrayList
,HashMap
, dll.) - Library:Apache POI
(digunakan untuk membaca/mengolah file Excel, yang terdiri dari banyak package).Jadi, package adalah bagian dari library, tapi tidak semua package adalah library. 😊
-
Packages
- Package adalah cara untuk mengelompokkan kelas, interface, enumeration, dan annotation yang saling berkaitan.
- Tujuannya adalah untuk mengorganisasi kode agar lebih rapi dan mudah dikelola.
- Proteksi akses: Package membantu mengatur visibilitas (aksesibilitas) antar kelas, misalnya dengan modifier seperti public, protected, atau default (package-private).
-
-
Local file Local file
-
Relatable
di casting biar method is larger bisa dipanggil lagi.
yg bisa di casting itu kalo implement Relatable
Relatable r = new RectanglePlus()
bisa masuk ke array realatable r[] sebenernya kalo depannya RectanglePlus pun bisa, tapi ini plusnya kalo ditengah tbtb di casting ganti, ex: r = CirclePlus() tetep works
-
Interface
Di Java, list, linkedlist dll itu pake Interface. Semua metode yang harus ada kaya insert delete dll pake interface di implementasikannya
-
isLargerThan
Disini itu bisa muncul masalah, RectanglePlus ketika dipanggil ke isLargerThen bisa runtime error kalo parameternya bukan panjang tapi point.
Ganti parameternya dari isLargerThan(Object obj1) jadi (Relatable r1) biar p1 gabisa masuk dan lgsg compile error.
-
Object
Object biar semua bisa masuk di parameter ini
-
Relatable
di casting biar method is larger bisa dipanggil lagi
-
Object
Object biar semua bisa masuk di parameter ini
-
- Dec 2024
-
Local file Local file
-
isUnerLeft
Apa sih perbedaan IsUnerLeft dengan IsSkewLeft?
isUnerLeft
:- Hanya mengecek hubungan akar dan anak langsungnya.
- Fokus pada apakah akar memiliki anak kiri saja, tanpa memedulikan keseluruhan struktur pohon.
-
Contoh:
A / B
isUnerLeft(A)
: True, karenaA
hanya punya anak kiri (B
).
A / B / \ C D
-isUnerLeft(A)
: Tetap True, karena hanyaA
yang dicek, danA
hanya punya anak kiri (B
), tanpa memperhatikan apa yang ada di bawahB
.
isSkewLeft
:- Memeriksa seluruh pohon.
- Pastikan semua simpul dalam pohon hanya memiliki anak kiri, secara rekursif.
- Contoh:
A / B / C
isSkewLeft(A)
: True, karena semua simpul hanya memiliki anak kiri.A / B \ C
isSkewLeft(A)
: False, karenaB
punya anak kanan (C
).
Kesimpulan:
isUnerLeft
: Hanya fokus pada simpul akar dan anak langsungnya (lokal).isSkewLeft
: Mengevaluasi keseluruhan pohon biner secara rekursif, memastikan miring ke kiri sepenuhnya.
-
Penting
WOY BACA HIGHLIGHT IS UNER LEFT
-
else: delLeft(p↑.left,x)
bisa unerleft/biner, dua duanya punya subpohon kiri maka solusi dijadikan satu
-
isUnerRight(p): delLeft(p↑.right,x)
kalo unerright gapunya subpohon kiri
-
DelDaunTerkiri
Basis 1. btw untuk menentukan basis (kondisi dasar) apa yg dipake bisa dikira-kira, berhubungan daun selalu 1 btw
-
input/output p
input output karena p AKAN BERUBAH
-
1 + max(depth(p↑.left), depth(p↑.right))
dihiitung tinggi kiri dan kanan, bandingkan mana yg tertinggi, pilih tertinggi lalu tambah 1 (akar)
-
Tinggi/Kedalaman Pohon
Pakai basis 0
-
isBiner(p) : → nbLeaf1(p↑.left) + nbLeaf1(p↑.right)
sama aja kaya nb element tapi akar == 0
-
nbLeaf1
ini baru rekursif, basis 1 karena memang hanya memproses berdasarkan basis 1, basis 0 udh di handle
-
nbLeaf
ini bukan rekursif karena gaada pemanggilan diri dia sendiri, hanya analisis kasus biasa
-
0 (utk akar) + Jumlah_daun(pohon kiri) + Jumlah_daun(pohon kanan)
daun itu terujung
-
isUnerLeft(p) : → 1 + nbElmt(p↑.left)isUnerRight(p): → 1 + nbElmt(p↑.right)isBiner(p) : → 1 + nbElmt(p↑.left) + nbElmt(p↑.right)
Fungsi dibuat seperti ini untuk mencegah NbElmt dengan basis 0.Oke, mari kita sederhanakan penjelasannya.
Kenapa Basis 1 Butuh unerleft, unerright, dan isbiner?
- Basis 1 adalah aturan di mana rekursi hanya berhenti kalau pohon punya satu simpul (akar saja).
- Untuk memastikan rekursi tetap berjalan sesuai aturan basis 1, kita perlu tahu bentuk struktur pohon yang sedang diproses:
- Pohon punya anak kiri saja (unerleft).
- Pohon punya anak kanan saja (unerright).
- Pohon punya dua anak (isbiner).
Dengan kata lain, kita pecah bentuk pohon menjadi 3 kategori supaya fungsi bisa tahu ke mana rekursi harus berjalan (kiri saja, kanan saja, atau kiri dan kanan).
Kenapa Bukan Basis 0?
- Basis 0 berhenti kalau pohon kosong (
NIL
). - Tapi di basis 1, kita tidak menganggap pohon kosong sebagai bagian dari logika. Kita hanya peduli pada pohon yang punya minimal satu simpul.
- Jadi, logika basis 1 menghindari pohon kosong dan memaksa fungsi hanya berhenti kalau pohon punya satu simpul saja.
Contoh Sederhana
Misalkan ada pohon seperti ini:
A / \ B C / D
Dengan Basis 1:
- Kalau pohon punya satu simpul (seperti
D
), langsung hitung dan berhenti. - Kalau pohon punya anak kiri saja, lanjut ke kiri (contoh:
B
). - Kalau pohon punya anak kanan saja, lanjut ke kanan.
- Kalau pohon punya dua anak (contoh:
A
), proses keduanya.
Kode Sederhana
c function NbElmt(p: BinTree) -> integer IF isOneElmt(p) THEN RETURN 1 ELSE IF unerleft(p) THEN RETURN 1 + NbElmt(LEFT(p)) ELSE IF unerright(p) THEN RETURN 1 + NbElmt(RIGHT(p)) ELSE IF isbiner(p) THEN RETURN 1 + NbElmt(LEFT(p)) + NbElmt(RIGHT(p))
isOneElmt(p)
: Kalau pohon cuma satu simpul, berhenti di situ.unerleft(p)
: Kalau pohon cuma punya anak kiri, hitung akar + rekursi ke kiri.unerright(p)
: Kalau pohon cuma punya anak kanan, hitung akar + rekursi ke kanan.isbiner(p)
: Kalau pohon punya dua anak, hitung akar + rekursi kiri + rekursi kanan.
Simpulan
- Basis 1 fokus ke pohon dengan minimal satu simpul, bukan pohon kosong.
unerleft
,unerright
, danisbiner
membantu memecah struktur pohon supaya rekursi berjalan dengan aturan basis 1, tanpa kembali ke logika basis 0 (pohon kosong).
-
Pohon Basis-1
Perbedaan utama antara pohon biner basis 0 dan pohon biner basis 1 terletak pada cara definisi kondisi dasar (basis) dalam proses rekursi dan bagaimana pohon tersebut direpresentasikan secara logis dalam setiap operasi. Mari kita perjelas:
1. Basis 0: Kondisi Kosong
Pada basis 0, pohon dianggap kosong jika tidak ada simpul sama sekali. Kondisi berhenti dalam rekursi adalah ketika pohon mencapai kondisi kosong.
Ciri-ciri Pohon Basis 0:
- Kondisi Terminasi:
IsTreeEmpty(p) == true
(artinya simpulp == NIL
). - Basis 0 digunakan untuk kasus di mana: ** - Pohon tidak memiliki simpul sama sekali (kosong)**.
- Proses rekursi berhenti saat mencapai simpul kosong.
- Definisi Rekursif:
- Pohon biner basis 0 didefinisikan sebagai:
- Pohon kosong, atau
- Sebuah simpul akar dengan dua sub-pohon kiri dan kanan yang juga pohon biner basis 0.
Ilustrasi Basis 0
Pohon Basis 0: Pohon Kosong -> Tidak ada simpul
Kondisi rekursi:
- Jika pohon kosong, berhenti. - Jika tidak kosong, proses akar, lalu lanjutkan ke sub-pohon kiri dan kanan.
2. Basis 1: Kondisi Satu Elemen
Pada basis 1, pohon dianggap memiliki satu elemen jika hanya ada satu simpul (simpul akar) tanpa sub-pohon kiri dan kanan. Kondisi berhenti dalam rekursi adalah ketika pohon memiliki hanya satu simpul.
Ciri-ciri Pohon Basis 1:
- Kondisi Terminasi:
isOneElmt(p) == true
(artinya simpulp
adalah akar, danLEFT(p) == NIL
sertaRIGHT(p) == NIL
). - Basis 1 digunakan untuk kasus di mana:
- Pohon memiliki satu elemen (akar saja), tanpa sub-pohon.
** - Proses rekursi berhenti saat mencapai simpul tunggal.**
- Definisi Rekursif:
- Pohon biner basis 1 didefinisikan sebagai:
- Sebuah simpul akar tanpa sub-pohon kiri dan kanan, atau
- Sebuah simpul akar dengan dua sub-pohon kiri dan kanan yang juga pohon biner basis 1.
Ilustrasi Basis 1
Pohon Basis 1: Pohon dengan Satu Simpul A / \ NIL NIL
Kondisi rekursi: - Jika pohon hanya memiliki satu elemen, berhenti. - Jika memiliki lebih dari satu elemen, proses akar, lalu lanjutkan ke sub-pohon kiri dan kanan.
Perbandingan
| Aspek | Basis 0 | Basis 1 | |-----------------------|----------------------------------------|----------------------------------------| | Kondisi Terminasi |
IsTreeEmpty(p) == true
|isOneElmt(p) == true
| | Definisi Kosong | Pohon benar-benar kosong (tidak ada) | Pohon kosong hanya setelah 1 elemen | | Definisi Rekursif | Pohon kosong atau memiliki simpul akar dan dua sub-pohon basis 0. | Pohon satu elemen, atau akar dengan dua sub-pohon basis 1. | | Contoh Pohon | Kosong:NIL
| Satu elemen: simpul denganLEFT = NIL
danRIGHT = NIL
| | Penggunaan Rekursi| Berhenti saat pohon kosong | Berhenti saat pohon terdiri dari satu simpul. |
Contoh dalam Rekursi
Basis 0 (Kosong)
Fungsi menghitung jumlah elemen pohon basis 0:
c function nbElmt(p: BinTree) -> integer { KAMUS LOKAL } { ALGORITMA } IF IsTreeEmpty(p) THEN RETURN 0 ELSE RETURN 1 + nbElmt(LEFT(p)) + nbElmt(RIGHT(p))
- Basis 0: Jika pohon kosong (IsTreeEmpty(p)
), kembalikan 0. - Rekursi berlanjut sampai semua simpul diakses.Basis 1 (Satu Elemen)
Fungsi menghitung jumlah elemen pohon basis 1:
c function nbElmt(p: BinTree) -> integer { KAMUS LOKAL } { ALGORITMA } IF IsTreeEmpty(p) THEN RETURN 0 ELSE IF isOneElmt(p) THEN RETURN 1 ELSE RETURN 1 + nbElmt(LEFT(p)) + nbElmt(RIGHT(p))
- Basis 1: Jika pohon hanya memiliki satu elemen (isOneElmt(p)
), kembalikan 1. - Rekursi berlanjut jika pohon memiliki lebih dari satu simpul.
Kesimpulan
- Basis 0: Fokus pada kondisi pohon kosong. Rekursi berhenti ketika tidak ada simpul lagi.
- Basis 1: Fokus pada kondisi pohon dengan satu simpul. Rekursi berhenti ketika simpul tunggal ditemukan.
- Pilihan antara basis 0 atau basis 1 tergantung pada konteks operasi dan cara definisi pohon biner yang diinginkan.
- Kondisi Terminasi:
-
Basis 1: jika pohon satu elemen, maka jumlah elemen adalah 1
TIDAK AKAN PERNAH BERTEMU POHON KOSONG
-
1
akar
-
postOrder(p↑.left)postOrder(p↑.right)proses(p)
ini urutannya pokonya ngikutin requirement nya aja
-
proses(p)
proses akar ada di tengah
-
if isTreeEmpty(p) then { Basis-0 }{ do nothing }
ini tuh berarti kaya kondisi terminasi ya. Penjelasan, Ya, Anda benar! Dalam contoh kode
PrintPreOrder
dari PDF, basis 0 bertindak sebagai kondisi terminasi dari proses rekursi. Basis 0 memastikan bahwa traversal berhenti saat mencapai sub-pohon kosong (atau simpul tanpa anak).Penjelasan Rekursi
PrintPreOrder
1. Pola Traversal PreOrder
Traversal pre-order dilakukan dengan urutan: 1. Proses akar. 2. Traversal sub-pohon kiri. 3. Traversal sub-pohon kanan.
Pada setiap langkah, rekursi dipanggil untuk sub-pohon kiri terlebih dahulu, lalu sub-pohon kanan.
2. Basis 0 sebagai Kondisi Terminasi
- Basis 0 diartikan sebagai kondisi di mana simpul pohon yang sedang diproses adalah kosong (
NULL
). - Ketika simpul pohon bernilai
NULL
, fungsi atau prosedur rekursi akan berhenti untuk cabang tersebut dan kembali ke level rekursi sebelumnya. - Hal ini mencegah rekursi tanpa akhir dan menjaga traversal tetap valid.
3. Alur Rekursi
- Dari akar pohon:
- Cetak nilai akar.
- Rekursi ke sub-pohon kiri (terus ke bawah sampai mencapai simpul kosong).
- Rekursi ke sub-pohon kanan (terus ke bawah sampai simpul kosong).
- Basis 0 memastikan bahwa jika simpul yang sedang diproses adalah
NULL
, tidak ada lagi pemanggilan rekursif, sehingga traversal "berbalik" ke simpul di atasnya.
Kode
PrintPreOrder
Berikut adalah cuplikan kode dari PDF pada halaman 23:
c procedure PrintPreOrder(p: BinTree) /* I.S. p terdefinisi */ /* F.S. Semua node pohon dicetak secara pre-order */ { KAMUS LOKAL } { ALGORITMA } IF NOT IsTreeEmpty(p) THEN Print(INFO(p)) /* Proses simpul akar */ PrintPreOrder(LEFT(p)) /* Proses sub-pohon kiri */ PrintPreOrder(RIGHT(p)) /* Proses sub-pohon kanan */
- Kondisi
IsTreeEmpty(p)
memeriksa apakah simpulp
adalahNULL
. Jika ya, maka traversal untuk simpul ini berhenti (basis 0). - Jika tidak kosong, simpul diproses (dicetak), lalu rekursi dipanggil untuk sub-pohon kiri dan kanan.
Ilustrasi Traversal
Misalkan pohon biner seperti berikut:
A / \ B C / \ D E
Traversal pre-order: 1. Cetak A. 2. Rekursi ke sub-pohon kiri B: - Cetak B. - Rekursi ke sub-pohon kiri D: - Cetak D. - Basis 0: D tidak memiliki anak, kembali ke B. - Rekursi ke sub-pohon kanan E: - Cetak E. - Basis 0: E tidak memiliki anak, kembali ke B, lalu ke A. 3. Rekursi ke sub-pohon kanan C: - Cetak C. - Basis 0: C tidak memiliki anak.
Hasil pre-order: A, B, D, E, C.
Kesimpulan
- Basis 0 memastikan rekursi berhenti pada simpul kosong, sehingga traversal "berbalik" ke simpul di atasnya.
- Dalam traversal pre-order, rekursi terjadi dari akar → kiri → kanan, dengan basis 0 menjadi kondisi terminasi untuk setiap cabang sub-pohon.
- Basis 0 diartikan sebagai kondisi di mana simpul pohon yang sedang diproses adalah kosong (
-
output(p↑.info)
ini proses(p) kalau print pre order
-
C-D-B-F-G-E-A
mulai dari baris terbawah. C karna gaada subpohon kiri, subpohon kanan maka C doang, lalu pindah ke kanannya (D), terus pindah ke sub pohon kanan
-
Pohon biner tidak kosong terdiri dari sebuah simpul akar dan dua anakyang salah satunya pasti tidak kosong
pasti sub pohon salah satunya ga kosong, kalo yg basis 0 bisa kosong
-
Gunakan isUnerLeft, isUnerRight, isBiner untuk memastikan tidakterjadi pemrosesan pada pohon kosong
tidak akan pernah ketemu pohon kosong di basis 1
-
Basis: pohon biner yang hanya terdiri dari akar {menggunakan predikat isOneElmt}
Basisnya hanya akar doang, kalau IsOneElement(p) == true
-
deallocTreeNode (input/output p: Address)
dealokasi pohon P
-
x: ElType
info dari sebuah node
-
Konstruktor
ada 2 bentuk, fungsi dan prosedur. Perbedaan utama antara fungsi dan prosedur dalam pembuatan pohon biner terletak pada cara mereka mengembalikan hasilnya:
- Fungsi (
function
): - Fungsi menghasilkan
BinTree
sebagai nilai kembalian (return value). - Hasilnya langsung berupa pohon biner yang terbentuk, dan fungsi tersebut tidak memodifikasi parameter input secara langsung.
-
Contoh: Pada halaman 15, fungsi
Tree
mengembalikan pohon biner yang dibuat dari akar dan dua sub-pohon kiri dan kanan, tanpa memanipulasi argumen input:c function Tree(akar: ElType, l: BinTree, r: BinTree) → BinTree
-
Prosedur (
procedure
): - Prosedur menggunakan parameter output (seperti
p
atauBinTree
) untuk memberikan hasilnya. - Parameter output ini biasanya dapat dimodifikasi lebih lanjut di luar prosedur.
- Contoh: Pada halaman 15, prosedur
CreateTree
memanfaatkan parameteroutput
untuk memberikan hasil pohon biner:c procedure CreateTree(input akar: ElType, input l, r: BinTree, output p: BinTree)
Kapan Menggunakan Fungsi atau Prosedur?
-
- Gunakan fungsi ketika hasil akhir hanya berupa sebuah pohon biner, tanpa perlu manipulasi lebih lanjut.
-
- Gunakan prosedur ketika pohon biner yang dihasilkan memerlukan penanganan lebih lanjut (misalnya, manipulasi node).
Pendekatan ini membantu membedakan tujuan kode Anda: apakah untuk mendapatkan hasil langsung (immutable seperti fungsi) atau untuk manipulasi lanjutan (mutable seperti prosedur).
- Fungsi (
-
input akar: ElType,input l: BinTree, input r: BinTree,output p: BinTree
3 parameter sama, tapi sebagai outputnya kalau tadi berbentuk BinTree kalau ini berbentuk p yang bisa di passing/assign
-
akar: ElType, l: BinTree, r: BinTree
nanti fungsi Tree akan menyambungkan antara inputan Akar ke subpohon kiri L dan subphon kanan R
-
procedure
bintree yang dihasilkan di representasikan oleh sebuah parameter output P
-
function
akan menghasilkan bintree
-
Address left;Address right
bisa disebut BinTree juga pada dasarnya BinTree di definisikan juga sebagai Address
-
ADT Pohon Biner
Cara akses nya: Akar(P), Left(P), Right(P)
-
Address
pointer terhadap sbuah simple
-
Pohon biner condong kanan
tidak pernah punya subpohon kiri
-
Pohon biner condong kir
tidak pernah punya subpohon kanan
-
3 *
anak dari simpul makk 2 gabisa lebih
-
terdiri atas sebuah simpul yang disebut akar dan dua buah himpunan lainyangdisjoint yang merupakan pohon biner, yang disebut sebagai subpohon kiri dan sub pohon kanan
intinya bisa punya akar yang di dalamnya ada subpohon kiri dan subpohon kanan
-
Linier
jir
-
Postfix
dari subpohon kiri, subpohon kanan, lalu akar
-
Prefix
prefix simbol akar di awal, diikuti subpohon kiri, dan subpohon kanan
-
-
Local file Local file
-
Penambahan Relasi Baru
ini berarti untuk MK_DOS
-
MK_DOS
- relasi ⟨Dosen, MataKuliah⟩ {atau relasi mengajar}.
- struktur nodenya, elemen satu nunjuk ke matkul, 2 ke dosen, 3 next
-
relasi⟨Dosen, MataKuliah⟩
INI MK_DOS
-
Relasi sebagai list terpisah
relasi hubungan mengajar dipisah
-
MataKuliah
Sebuah mata kuliah bisa diajar lebih dari 1 dosen
-
Dosen
- List biru: list dosen
- List hijau: penghubung yang menunjukkan hubungan "mengajar" ke mata kuliah
- List merah: mata kuliah
-
-
Local file Local file
-
Mendaftarkan anak yang baru lahir
kinerja sama aja
-
Alternatif-2
kinerja lebih baik
-
Alternatif-1:
akan memberikan kinerja yg lebih baik untuk fitur ini
-
if father(anak)=pegawai then
ada kondisional cek apakah ortu nya sama dengan pegawai yang lagi di iterasi
-
FirstPeg: ListPegFirstAnak: ListAnak
first ada dua biji
-
father: AdrPeg
ada pointer ke ayah
-
FirstPeg: ListPeg
FirstPeg menunjuk ke pegawai pertama
-
List Pegawai
- Pegawai A akan mempunyai anak X dan Y, maka list anak akan kebawah muncul dari list pegawai
- Jadi ada dua pointer, satu buat hubungan dan satu buat next. Tapi list disatukan
-
List Pegawai dengan 3 elemen
Kalo ini list anak dan pegawai dipisahkan, list anak akan menunjuk ke list pegawai yang sesuai. Jadi ada dua pointer, satu buat hubungan dan satu buat next.
-
-
Local file Local fileGraph11
-
Regular graphs
REgular graph dan graph lain yang ga ngestate jenis directed/undirected berarti APPLY KE KEDUA JENIS TERSEBUT.
-
newGraphNode
alokasi node
-
3
ada 3 node yang masuk ke no 5
-
0
tidak ada 1 busur yang masuk ke node 1
-
Latihan Graph
-
karena simpul ada 5, maka punya leader list yang elemennya ada 5. trailer list itu kotak dua kbawah yang ada 4 dan 1 di paling bawah.
-
trailer list akan menyatakan seluruh busur yang menghubungkan antara node tersebut ke node yang lain
- contohnya node 1, nunjuk ke 2 dan 3. maka akan punya 2 trailer list yang menunjuk ke 2 dan 3
-
-
Simpul dan busur disimpan sebagai objek/record yang memuat informasi tentangsimpul/busur tersebutSetiap simpul menyimpan list dari busur yang terhubung dengannya
meyimpan simpul dan list simpul yang terhubung dengannya
-
node
jumlah simpul ada 6, maka node ada 6
-
node
karna banyak node 6, maka matriks nya 6x6
-
list of nodes
menghasilkan list of node yang berisi daftar simpul yang bertetangga dengan v
-
v1, v2
parameter
-
[vs undirected graphs]
kebalikan dari undirected graph (ga ada arah), a->k k->a diasumsikan sama aja
-
-
Local file Local file
-
char *s = "(A()())";
contoh string
-
(*idx)++;
setelah selesai buat phon kanan akan menunjuk kurung tutup, dan harus di advance lagi
-
BuildTreeFromString(&LEFT(*t),st,idx);BuildTreeFromString(&RIGHT(*t),st,idx);
kalo udh ketemu kurung buka sudah siap memanggil fungsi yang sama dengan parameter left dari T, setelah left terbentuk panggil dengan parameter right
-
(*idx)++;
maju ke idx slanjutnya, dalam representasi list ini setelah abjad adalah karakter kurung buka,
-
t = newTreeNode(st[*idx])
ciptakan node dengan abjad yang ditunjuk idx
-
else
abjad
-
(*idx)++
mirip ADV
-
int *idx
idx menunjuk ke index dari string st, index akan berada di awal string. seiring dipanggilnya void yg sama, idx bergerak ke kanan dan pohon dibangun secara rekursif
-
char *st
string yg digunakan
-
start
yg tadi ya jadi diluar build tree
-
BuildTree(&(LEFT(*t)));BuildTree(&(RIGHT(*t)))
akan memanggil prosedur yg sama dengan parameter Left dari T dan setelah selesai untuk Right dari T.
-
else
abjad
-
BuildTree
start mesin karakter akan dipanggil oleh prosedur yang memanggil build tree (di kode lain sblm fungsi ini)
-
Struktur data yang digunakan adalah tree biasa (tidak memerlukan pointer keBapak)
dalam typedef gaada parent: Address
-
*t = ptr;
currentParrent == Nil artinya ptr akan menjadi akar dari pohon kita
-
currParent != NIL
awal pembangunan pohon
-
currParent = PARENT(CurrParent);
naik
-
if (c1 != '(') {
sebenarnya sudah selesai dengan subpohon kanan, waktunya naik
-
insKi = ( c1 != ')')
kondisi insertkiri, C1 != ')' kalo kanan berarti sama dengan
-
default
abjad
-
insKi
apakah node akan disisipkan sebagai subpohon kiri atau subpohon kanan
-
ElType x
valuenya x
-
newTreeNode
alokasi
-
dibutuhkan informasi karakter sebelumnya → karena itu digunakan mesin couple (C1, CC)
jadi ada dua window di mesin karakter (mesin couple)
-
parent: Address
TAMBAHAN
-
(K()())))
BARIS KEDUA
-
(J()()))
subpohon kanan DIBARIS KEDUA
-
Contoh - 2IF2110/IF2111 Pohon Biner (Bagian 2) 15(A(B(C(D()())(E()()))
pokonya kalo baris pertama selalu kiri, max ada 2 baris dan di baris kedua itu sub pohon kanan
-
(C()())
subpohon kanan A
-
(B()())
subphon kiri A
-
()
sub phon kanan kosong
-
()
subpohon kiri kosong
-
q↑.info.count ← p↑.info.count
janlup ini juga
-
q↑.info.key ← p↑.info.key { salin info p ke q }
ketika dah ditemukan anak terbesar
-
p↑.right NIL: delNode(p↑.right)
supaya dapat anak terbesar
-
delNode(q↑.left)
akan mencari anak terbesar dari subpohon kiri yang dimiliki oleh q
-
isUnerLeft(q) : p ← q↑.left
q punya subpohon kiri, set p jadi kiri dari q (anak dari subpohon kiri dari q akan dimasukkan kedalam p)
-
isUnerRight(q): p ← q↑.right
q punya subpohon kanan, set p jadi right dari q (anak dari subpohon kanan dari q akan dimasukkan kedalam p)
-
depend on q
cek apakah q dgn kondisi dibawah
-
isOneElmt(q) : p ← NIL
kalo daun, set p jadi NIL
-
x.key < p↑.info.key : delBTree(p↑.left, x)
kiri mas
-
input x: ElType
node yang akan dihapus
-
DelBTree(p,10)
copy nilai 8 ke 10 lalu hapus node 8
-
DelBTree(p,5)
sama, node 3 dicopy ke posisi 5, lalu yg node 3 dihapus
-
DelBTree(p,15)53 813181013
lebih rumit karena 13 harus dipindah menggantikan posisi node bervalue 15, caranya 1. copy nilai node 13 ke 15 2. hapus node 13
-
x.key < p↑.info.key : insSearchTree(x, p↑.left)x.key > p↑.info.key : insSearchTree(x, p↑.right)
p itu akar, kiri kalo lebih kecil dari p, kanan kalo lebih gede dari p
-
x.key = p↑.info.key : p↑.info.count ← p↑.info.count + 1
kalo sama (muncul lebih dari sekali) count di increment
-
input x: ElType
value dari node
-
insSearchTree
melakukan insert node pada BST
-
Banyak kemunculan suatunilai key disimpan dalam field “count”
kalau key muncul > 1 ada field count yang akan mencatat banyaknya kemunculan nilai tersebut
-
Nilai simpul (key)
value
-
• semua simpul pada subpohon kiri < Akar p• semua simpul pada subpohon kanan >= Akar p
urutan isi elmen itu kiri < akar <= kanan
-
Subpohon kiri dan subpohon kanan merupakan BST
jadi definisi rekursif
-
p
pohon biner
-
p↑.left ← l; p↑.right ← r
Menyambungkan dengan elemen akar yang dibuat setelah subpohon terbuat
-
nR ← n – nL - 1
- 1 (akar)
-
if (p NIL)
alokasi berhasil
-
nL, nR
banyak node di sisi kiri L dan sisi kanan R
-
if (n = 0) then { Basis-0 }
basis0
-
n: integer
banyak node yang akan dibuat
-