mirror of
https://github.com/AdrianKuta/Tree-Data-Structure.git
synced 2025-07-01 15:27:58 +02:00
Compare commits
17 Commits
Author | SHA1 | Date | |
---|---|---|---|
c2ebd5dfe4 | |||
c320411a40 | |||
3c3d418aa2 | |||
f00ab975dc | |||
eb2d5f07be | |||
3f166aced0 | |||
8dbbd3b2f8 | |||
f8206013c2 | |||
cf3e5e2c6a | |||
5cdf1a9cbc | |||
c30d516bd2 | |||
dc0317daba | |||
9834cbf07c | |||
1b08504ab9 | |||
d49d813ab5 | |||
5dd80035e4 | |||
3e5401bd9d |
84
README.md
84
README.md
@ -1,47 +1,73 @@
|
|||||||
# Tree (Data Structure)
|
# Tree (Data Structure)
|
||||||
[](https://search.maven.org/artifact/com.github.adriankuta/tree-structure)
|
[](https://mvnrepository.com/artifact/com.github.adriankuta/tree-structure)
|
||||||
[](https://github.com/AdrianKuta/Design-Patterns-Kotlin/blob/master/LICENSE)
|
[](https://github.com/AdrianKuta/Design-Patterns-Kotlin/blob/master/LICENSE)
|
||||||
[](https://circleci.com/gh/AdrianKuta/Tree-Data-Structure)
|
[](https://circleci.com/gh/AdrianKuta/Tree-Data-Structure)
|
||||||
|
|
||||||
Simple implementation to store object in tree structure. Method `toString()` is overrided to provide nice tree view in logs.
|
Simple implementation to store object in tree structure. Method `toString()` is overrided to provide nice tree view in logs.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
|
**Kotlin**
|
||||||
```kotlin
|
```kotlin
|
||||||
val root = TreeNode<String>("Root")
|
val root = TreeNode("World")
|
||||||
val beveragesNode = TreeNode<String>("Beverages")
|
val northA = TreeNode("North America")
|
||||||
val curdNode = TreeNode<String>("Curd")
|
val europe = TreeNode("Europe")
|
||||||
root.addChild(beveragesNode)
|
root.addChild(northA)
|
||||||
root.addChild(curdNode)
|
root.addChild(europe)
|
||||||
|
|
||||||
val teaNode = TreeNode<String>("tea")
|
val usa = TreeNode("USA")
|
||||||
val coffeeNode = TreeNode<String>("coffee")
|
northA.addChild(usa)
|
||||||
val milkShakeNode = TreeNode<String>("Milk Shake")
|
|
||||||
beveragesNode.addChild(teaNode)
|
|
||||||
beveragesNode.addChild(coffeeNode)
|
|
||||||
beveragesNode.addChild(milkShakeNode)
|
|
||||||
|
|
||||||
val gingerTeaNode = TreeNode<String>("ginger tea")
|
val poland = TreeNode("Poland")
|
||||||
val normalTeaNode = TreeNode<String>("normal tea")
|
val france = TreeNode("France")
|
||||||
teaNode.addChild(gingerTeaNode)
|
europe.addChild(poland)
|
||||||
teaNode.addChild(normalTeaNode)
|
europe.addChild(france)
|
||||||
|
println(root.prettyString())
|
||||||
|
```
|
||||||
|
|
||||||
val yogurtNode = TreeNode<String>("yogurt")
|
**Pretty Kotlin**
|
||||||
val lassiNode = TreeNode<String>("lassi")
|
|
||||||
curdNode.addChild(yogurtNode)
|
|
||||||
curdNode.addChild(lassiNode)
|
|
||||||
|
|
||||||
println(root)
|
```kotlin
|
||||||
System.out.println("Remove: ${curdNode.value}")
|
val root =
|
||||||
root.removeChild(curdNode)
|
tree("World") {
|
||||||
System.out.println("Remove: ${gingerTeaNode.value}")
|
child("North America") {
|
||||||
root.removeChild(gingerTeaNode)
|
child("USA")
|
||||||
println(root)
|
}
|
||||||
|
child("Europe") {
|
||||||
|
child("Poland")
|
||||||
|
child("Germany")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
**Java**
|
||||||
|
```java
|
||||||
|
TreeNode<String> root = new TreeNode<>("World");
|
||||||
|
TreeNode<String> northA = new TreeNode<>("North America");
|
||||||
|
TreeNode<String> europe = new TreeNode<>("Europe");
|
||||||
|
root.addChild(northA);
|
||||||
|
root.addChild(europe);
|
||||||
|
|
||||||
|
TreeNode<String> usa = new TreeNode<>("USA");
|
||||||
|
northA.addChild(usa);
|
||||||
|
|
||||||
|
TreeNode<String> poland = new TreeNode<>("Poland");
|
||||||
|
TreeNode<String> france = new TreeNode<>("France");
|
||||||
|
europe.addChild(poland);
|
||||||
|
europe.addChild(france);
|
||||||
|
System.out.println(root.prettyString());
|
||||||
```
|
```
|
||||||
|
|
||||||
*Output:*
|
*Output:*
|
||||||
|
|
||||||
<img src="https://github.com/AdrianKuta/Tree-Collection/blob/master/images/console_output.png" width=400>
|
```
|
||||||
|
World
|
||||||
|
├── North America
|
||||||
|
│ └── USA
|
||||||
|
└── Europe
|
||||||
|
├── Poland
|
||||||
|
└── France
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
3
_config.yml
Normal file
3
_config.yml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
theme: jekyll-theme-minimal
|
||||||
|
title: Tree Data Structure
|
||||||
|
logo: images/console_output.png
|
@ -15,7 +15,7 @@ android {
|
|||||||
minSdkVersion 15
|
minSdkVersion 15
|
||||||
targetSdkVersion 29
|
targetSdkVersion 29
|
||||||
versionCode 1
|
versionCode 1
|
||||||
versionName "1.1.0"
|
versionName "1.2.3"
|
||||||
|
|
||||||
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
|
||||||
consumerProguardFiles 'consumer-rules.pro'
|
consumerProguardFiles 'consumer-rules.pro'
|
||||||
|
@ -5,17 +5,18 @@ interface ChildDeclarationInterface<T> {
|
|||||||
/**
|
/**
|
||||||
* This method is used to easily create child in node.
|
* This method is used to easily create child in node.
|
||||||
* ```
|
* ```
|
||||||
* val root = treeNode("World") {
|
* val root = tree("World") {
|
||||||
* treeNode("North America") {
|
* child("North America") {
|
||||||
* treeNode("USA")
|
* child("USA")
|
||||||
* }
|
* }
|
||||||
* treeNode("Europe") {
|
* child("Europe") {
|
||||||
* treeNode("Poland")
|
* child("Poland")
|
||||||
* treeNode("Germany")
|
* child("Germany")
|
||||||
* }
|
* }
|
||||||
* }
|
* }
|
||||||
* ```
|
* ```
|
||||||
|
* @return New created TreeNode.
|
||||||
*/
|
*/
|
||||||
@JvmSynthetic
|
@JvmSynthetic
|
||||||
fun treeNode(value: T, childDeclaration: ChildDeclaration<T>? = null)
|
fun child(value: T, childDeclaration: ChildDeclaration<T>? = null): TreeNode<T>
|
||||||
}
|
}
|
@ -27,11 +27,12 @@ open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationIn
|
|||||||
}
|
}
|
||||||
|
|
||||||
@JvmSynthetic
|
@JvmSynthetic
|
||||||
override fun treeNode(value: T, childDeclaration: ChildDeclaration<T>?) {
|
override fun child(value: T, childDeclaration: ChildDeclaration<T>?): TreeNode<T> {
|
||||||
val newChild = TreeNode(value)
|
val newChild = TreeNode(value)
|
||||||
if(childDeclaration != null)
|
if(childDeclaration != null)
|
||||||
newChild.childDeclaration()
|
newChild.childDeclaration()
|
||||||
_children.add(newChild)
|
_children.add(newChild)
|
||||||
|
return newChild
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -91,6 +92,10 @@ open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationIn
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun toString(): String {
|
override fun toString(): String {
|
||||||
|
return value.toString()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun prettyString(): String {
|
||||||
val stringBuilder = StringBuilder()
|
val stringBuilder = StringBuilder()
|
||||||
print(stringBuilder, "", "")
|
print(stringBuilder, "", "")
|
||||||
return stringBuilder.toString()
|
return stringBuilder.toString()
|
||||||
|
@ -5,13 +5,14 @@ typealias ChildDeclaration<T> = ChildDeclarationInterface<T>.() -> Unit
|
|||||||
/**
|
/**
|
||||||
* This method can be used to initialize new tree.
|
* This method can be used to initialize new tree.
|
||||||
* ```
|
* ```
|
||||||
* val root = treeNode("World") { ... }
|
* val root = tree("World") { ... }
|
||||||
* ```
|
* ```
|
||||||
* @see [ChildDeclarationInterface.treeNode]
|
* @param root Root element of new tree.
|
||||||
|
* @see [ChildDeclarationInterface.child]
|
||||||
*/
|
*/
|
||||||
@JvmSynthetic
|
@JvmSynthetic
|
||||||
inline fun<reified T> treeNode(value: T, childDeclaration: ChildDeclaration<T>): TreeNode<T> {
|
inline fun<reified T> tree(root: T, childDeclaration: ChildDeclaration<T>): TreeNode<T> {
|
||||||
val treeNode = TreeNode(value)
|
val treeNode = TreeNode(root)
|
||||||
treeNode.childDeclaration()
|
treeNode.childDeclaration()
|
||||||
return treeNode
|
return treeNode
|
||||||
}
|
}
|
@ -114,17 +114,29 @@ class TreeNodeTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
fun kotlinExtTest() {
|
fun kotlinExtTest() {
|
||||||
val root = treeNode("World") {
|
val root = TreeNode("World")
|
||||||
treeNode("North America") {
|
val northA = TreeNode("North America")
|
||||||
treeNode("USA")
|
val europe = TreeNode("Europe")
|
||||||
}
|
root.addChild(northA)
|
||||||
treeNode("Europe") {
|
root.addChild(europe)
|
||||||
treeNode("Poland")
|
|
||||||
treeNode("Germany")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
println(root)
|
|
||||||
}
|
|
||||||
|
|
||||||
|
val usa = TreeNode("USA")
|
||||||
|
northA.addChild(usa)
|
||||||
|
|
||||||
|
val poland = TreeNode("Poland")
|
||||||
|
val france = TreeNode("France")
|
||||||
|
europe.addChild(poland)
|
||||||
|
europe.addChild(france)
|
||||||
|
|
||||||
|
val rootExt = tree("World") {
|
||||||
|
child("North America") {
|
||||||
|
child("USA")
|
||||||
|
}
|
||||||
|
child("Europe") {
|
||||||
|
child("Poland")
|
||||||
|
child("France")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
assertEquals(root.prettyString(), rootExt.prettyString())
|
||||||
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user