Skip to content

Commit

Permalink
feat: Add the display of the binary search tree, add the ability to i…
Browse files Browse the repository at this point in the history
…nsert a node and clear the tree.
  • Loading branch information
SurfaceYellowDuck committed Apr 29, 2023
1 parent c52816b commit 62cfba7
Show file tree
Hide file tree
Showing 9 changed files with 154 additions and 58 deletions.
13 changes: 2 additions & 11 deletions app/src/main/kotlin/app/App.kt
Original file line number Diff line number Diff line change
@@ -1,19 +1,10 @@
package app

import app.view.MainView
import javafx.stage.Stage
import tornadofx.*

class MainApp: App(MainView::class){
override fun start(stage: Stage) {
with(stage){
width = 600.0
height = 400.0
}
super.start(stage)
}
class MyApp : App(MainView::class){
}

fun main() {
launch<MainApp>()
launch<MyApp>()
}
68 changes: 68 additions & 0 deletions app/src/main/kotlin/app/controller/BSTController.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package app.controller
import bst.BSTree
import bst.nodes.BSTNode
import javafx.scene.layout.Pane
import javafx.scene.paint.Color
import javafx.scene.shape.Circle
import javafx.scene.shape.Line

import tornadofx.Controller
import javafx.scene.control.Label

class BSTController: Controller(){
fun isNumeric(s: String): Boolean {
return try {
s.toInt()
true
} catch (e: NumberFormatException) {
false
}
}
fun insertNode(tree:BSTree<Int, String>, treePane: Pane, key: Int, value:String){
tree.insert(key, value)
drawTree(tree, treePane)
}
fun clearTree(tree:BSTree<Int, String>, treePane: Pane) {
tree.clear()
treePane.children.clear()
}

//make here not null check
private fun drawTree(tree:BSTree<Int, String>, treePane: Pane) {
treePane.children.clear()
if (tree.getRoot() != null) {
drawNode(tree.getRoot()!!, treePane, treePane.width / 2.0, 50.0, treePane.width / 4.0)
}
}

private fun drawNode(node: BSTNode<Int, String>, treePane: Pane, x: Double, y: Double, offsetX: Double) {
val circleRadius = 20.0
val circle = Circle(circleRadius)
circle.centerX = x
circle.centerY = y
circle.fill = Color.WHITE
circle.stroke = Color.BLACK
val nodeLabel = Label(node.key.toString())
nodeLabel.layoutX = circle.centerX - (circle.radius / 3)
nodeLabel.layoutY = circle.centerY - (circle.radius / 3)
treePane.children.addAll(circle,nodeLabel )

if (node.left != null) {
val leftX = x - offsetX
val leftY = y + 50
val leftLine = Line(x, y + circleRadius, leftX, leftY - circleRadius)
treePane.children.add(leftLine)
drawNode(node.left!!, treePane, leftX, leftY, offsetX / 2.0)
}

if (node.right != null) {
val rightX = x + offsetX
val rightY = y + 50
val rightLine = Line(x, y + circleRadius, rightX, rightY - circleRadius)
treePane.children.add(rightLine)
drawNode(node.right!!,treePane, rightX, rightY, offsetX / 2.0)
}
}
}


8 changes: 8 additions & 0 deletions app/src/main/kotlin/app/view/AdditionErrorFragment.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package app.view

import tornadofx.Fragment
import tornadofx.label

class AdditionErrorFragment: Fragment() {
override val root = label("Addition error")
}
13 changes: 4 additions & 9 deletions app/src/main/kotlin/app/view/MainView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,8 @@ import app.view.treeView.BinarySearchTreeView
import tornadofx.*

class MainView: View(){
private val tree = BinarySearchTreeView()
override val root = borderpane {
center{
add(tree)
}
left{
button("reset")
}
val tree: BinarySearchTreeView by inject()
override val root = vbox {
add(tree)
}
}
}
4 changes: 2 additions & 2 deletions app/src/main/kotlin/app/view/treeView/AVLTreeView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,12 @@ class AVLTreeView: View() {
override val root = vbox {
button("Binary Search Tree") {
action {
replaceWith<BinarySearchTreeView>()
replaceWith(BinarySearchTreeView::class, ViewTransition.Slide(0.3.seconds, ViewTransition.Direction.LEFT))
}
}
button("Red Black Tree") {
action {
replaceWith<RedBlackTreeView>()
replaceWith(RedBlackTreeView::class, ViewTransition.Slide(0.3.seconds, ViewTransition.Direction.LEFT))
}
}
}
Expand Down
51 changes: 48 additions & 3 deletions app/src/main/kotlin/app/view/treeView/BinarySearchTreeView.kt
Original file line number Diff line number Diff line change
@@ -1,17 +1,62 @@
package app.view.treeView
import tornadofx.*
import app.controller.BSTController
import app.view.AdditionErrorFragment
import bst.BSTree
import javafx.beans.property.SimpleStringProperty
import javafx.scene.layout.Pane
import javafx.stage.StageStyle

class BinarySearchTreeView: View() {
class BinarySearchTreeView : View() {
private val controller: BSTController by inject()
private val tree = BSTree<Int, String>()
private val treePane = Pane()
val key = SimpleStringProperty()
val value = SimpleStringProperty()
override val root = vbox {
hbox {
button("Clear") {
action { controller.clearTree(tree, treePane) }
}
form {
fieldset {
field("Key input") {
textfield(key)
}
field("Value input") {
textfield(value)
}

button("Add Node") {
action {
if (controller.isNumeric(key.value)){
controller.insertNode(tree, treePane, key.value.toInt(), value.value)
}
else{
find<AdditionErrorFragment>().openModal(stageStyle = StageStyle.UTILITY)
}
key.value = ""
value.value = ""
}
}
}
}
}
button("AVL Tree") {
action {
replaceWith<AVLTreeView>()
replaceWith(AVLTreeView::class, ViewTransition.Slide(0.3.seconds, ViewTransition.Direction.LEFT))
}
}
button("Red Black Tree") {
action {
replaceWith<RedBlackTreeView>()
replaceWith(RedBlackTreeView::class, ViewTransition.Slide(0.3.seconds, ViewTransition.Direction.LEFT))
}
}
this += treePane
treePane.apply {
minWidth = 600.0
minHeight = 400.0
style = "-fx-border-color: black;"
}
}
}
11 changes: 5 additions & 6 deletions app/src/main/kotlin/app/view/treeView/RedBlackTreeView.kt
Original file line number Diff line number Diff line change
@@ -1,22 +1,21 @@
package app.view.treeView
import app.view.treeView.AVLTreeView
import app.view.treeView.BinarySearchTreeView
import tornadofx.View
import tornadofx.action
import tornadofx.button
import tornadofx.vbox
import tornadofx.*

class RedBlackTreeView: View() {
override val root = vbox {
button("AVL Tree") {
action {
replaceWith<AVLTreeView>()
replaceWith(AVLTreeView::class, ViewTransition.Slide(0.3.seconds, ViewTransition.Direction.LEFT))

}
}

button("Binary Search Tree") {
action {
replaceWith<BinarySearchTreeView>()
replaceWith(BinarySearchTreeView::class, ViewTransition.Slide(0.3.seconds, ViewTransition.Direction.LEFT))

}
}
}
Expand Down
34 changes: 7 additions & 27 deletions trees/src/main/kotlin/bst/BSTree.kt
Original file line number Diff line number Diff line change
@@ -1,11 +1,7 @@
package bst
import bst.nodes.BSTNode

import com.google.gson.Gson
import java.io.FileReader
import java.io.FileWriter

class BSTree<K: Comparable<K>, V>(@Transient val key: K? = null, @Transient val value: V? = null): AbstractBST<K, V, BSTNode<K, V>>() {
class BSTree<K: Comparable<K>, V>(val key: K? = null, val value: V? = null): AbstractBST<K, V, BSTNode<K, V>>() {
override fun initNode(key: K, value: V): BSTNode<K, V> = BSTNode(key, value)
init {
if (key != null && value != null) {
Expand All @@ -16,27 +12,11 @@ class BSTree<K: Comparable<K>, V>(@Transient val key: K? = null, @Transient val
fun setName(treeName: String){
this.treeName = treeName
}
fun clear(){
this.rootNode = null
}



}



fun main(){
val test_data = BSTree("121", "dgs")
test_data.insert("110", "dafad")
test_data.insert("118", "adfaf")
test_data.insert("124", "fggsg")
test_data.insert("127", "fggsg")
test_data.insert("123", "fggsg")
test_data.setName("etst")
// test_data.saveTreeToJson()
// test_data.saveTree()
// readFromJson("tree_1.json")
// test_data.save_node(test_data.rootNode)
// val json = Gson().toJson(test_data)
// println(json)
// val ret_obj = Gson().fromJson<BSTree<Comparable<Any>, Any>>(json, BSTree::class.java)

fun getRoot(): BSTNode<K, V>?{
return this.rootNode
}
}
10 changes: 10 additions & 0 deletions trees/src/main/kotlin/bst/db/controllers/SQLController.kt
Original file line number Diff line number Diff line change
Expand Up @@ -141,3 +141,13 @@ class SQLController {
return deserializeTree(deserializedTree)
}
}

fun main() {
val controller = SQLController()
val tree = BSTree(1, "A")
tree.insert(2, "B")
tree.setName("asd")
controller.saveTreeToDB(tree)
val loadedTree = controller.getTree("asd")
loadedTree?.insert(3, "F")
}

0 comments on commit 62cfba7

Please sign in to comment.