mirror of
				https://github.com/AdrianKuta/Tree-Data-Structure.git
				synced 2025-10-31 08:53:41 +01:00 
			
		
		
		
	Compare commits
	
		
			11 Commits
		
	
	
		
			v3.0
			...
			772eeb0465
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 772eeb0465 | ||
|   | 456f889b9c | ||
|   | c3a4ca5925 | ||
|   | 06dc507590 | ||
|   | 5eaf027dba | ||
|   | 04c3728fcd | ||
|   | d34050e9af | ||
|   | 2c8381deac | ||
|   | 4aacbc9dbc | ||
|   | 8a4e677ebf | ||
|   | e34a85ac39 | 
							
								
								
									
										11
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								.github/dependabot.yml
									
									
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,11 @@ | ||||
| # To get started with Dependabot version updates, you'll need to specify which | ||||
| # package ecosystems to update and where the package manifests are located. | ||||
| # Please see the documentation for all configuration options: | ||||
| # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file | ||||
|  | ||||
| version: 2 | ||||
| updates: | ||||
|   - package-ecosystem: "" # See documentation for possible values | ||||
|     directory: "/" # Location of package manifests | ||||
|     schedule: | ||||
|       interval: "weekly" | ||||
							
								
								
									
										2
									
								
								.github/workflows/publishSnapshot.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/publishSnapshot.yml
									
									
									
									
										vendored
									
									
								
							| @@ -2,7 +2,7 @@ name: Publish Snapshot | ||||
|  | ||||
| on: | ||||
|   push: | ||||
|     branches: [master, '14-**'] | ||||
|     branches: [master] | ||||
|  | ||||
| jobs: | ||||
|   test: | ||||
|   | ||||
							
								
								
									
										6
									
								
								.idea/AndroidProjectSystem.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								.idea/AndroidProjectSystem.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="AndroidProjectSystem"> | ||||
|     <option name="providerId" value="com.android.tools.idea.GradleProjectSystem" /> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										3
									
								
								.idea/gradle.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										3
									
								
								.idea/gradle.xml
									
									
									
										generated
									
									
									
								
							| @@ -4,8 +4,9 @@ | ||||
|   <component name="GradleSettings"> | ||||
|     <option name="linkedExternalProjectsSettings"> | ||||
|       <GradleProjectSettings> | ||||
|         <option name="distributionType" value="WRAPPED" /> | ||||
|         <option name="testRunner" value="CHOOSE_PER_TEST" /> | ||||
|         <option name="externalProjectPath" value="$PROJECT_DIR$" /> | ||||
|         <option name="gradleJvm" value="#GRADLE_LOCAL_JAVA_HOME" /> | ||||
|         <option name="modules"> | ||||
|           <set> | ||||
|             <option value="$PROJECT_DIR$" /> | ||||
|   | ||||
							
								
								
									
										9
									
								
								.idea/kotlinScripting.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										9
									
								
								.idea/kotlinScripting.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,9 +0,0 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="KotlinScriptingSettings"> | ||||
|     <scriptDefinition className="org.jetbrains.kotlin.scripting.resolve.KotlinScriptDefinitionFromAnnotatedTemplate" definitionName="KotlinBuildScript"> | ||||
|       <order>2147483647</order> | ||||
|       <autoReloadConfigurations>true</autoReloadConfigurations> | ||||
|     </scriptDefinition> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										2
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.idea/misc.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,7 +1,7 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="ExternalStorageConfigurationManager" enabled="true" /> | ||||
|   <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="11" project-jdk-type="JavaSDK"> | ||||
|   <component name="ProjectRootManager" version="2" languageLevel="JDK_21" default="true" project-jdk-name="jbr-21" project-jdk-type="JavaSDK"> | ||||
|     <output url="file://$PROJECT_DIR$/out" /> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										17
									
								
								.idea/runConfigurations.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								.idea/runConfigurations.xml
									
									
									
										generated
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,17 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="RunConfigurationProducerService"> | ||||
|     <option name="ignoredProducers"> | ||||
|       <set> | ||||
|         <option value="com.intellij.execution.junit.AbstractAllInDirectoryConfigurationProducer" /> | ||||
|         <option value="com.intellij.execution.junit.AllInPackageConfigurationProducer" /> | ||||
|         <option value="com.intellij.execution.junit.PatternConfigurationProducer" /> | ||||
|         <option value="com.intellij.execution.junit.TestInClassConfigurationProducer" /> | ||||
|         <option value="com.intellij.execution.junit.UniqueIdConfigurationProducer" /> | ||||
|         <option value="com.intellij.execution.junit.testDiscovery.JUnitTestDiscoveryConfigurationProducer" /> | ||||
|         <option value="org.jetbrains.kotlin.idea.junit.KotlinJUnitRunConfigurationProducer" /> | ||||
|         <option value="org.jetbrains.kotlin.idea.junit.KotlinPatternConfigurationProducer" /> | ||||
|       </set> | ||||
|     </option> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										2
									
								
								.idea/vcs.xml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.idea/vcs.xml
									
									
									
										generated
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <project version="4"> | ||||
|   <component name="VcsDirectoryMappings"> | ||||
|     <mapping directory="$PROJECT_DIR$" vcs="Git" /> | ||||
|     <mapping directory="" vcs="Git" /> | ||||
|   </component> | ||||
| </project> | ||||
							
								
								
									
										21
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								README.md
									
									
									
									
									
								
							| @@ -97,3 +97,24 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | ||||
| LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | ||||
| OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | ||||
| SOFTWARE. | ||||
|  | ||||
| --- | ||||
|  | ||||
| ## Publishing (Maven Central migration) | ||||
|  | ||||
| This project is configured to publish via Sonatype's s01.oss.sonatype.org (Nexus) which is compatible with the new Central (central.sonatype.com). The old oss.sonatype.org host is no longer used. | ||||
|  | ||||
| Environment variables supported by the build: | ||||
| - CENTRAL_USERNAME / CENTRAL_PASSWORD — Central Portal user/token (preferred) | ||||
| - OSSRH_USERNAME / OSSRH_PASSWORD — legacy credentials (fallback) | ||||
| - SIGNING_KEY_ID / SIGNING_KEY / SIGNING_PASSWORD — PGP signing (ASCII-armored key) | ||||
| - SNAPSHOT — set to true to append -SNAPSHOT to version | ||||
|  | ||||
| Gradle tasks: | ||||
| - Publish all publications to Sonatype: `./gradlew publishAllPublicationsToSonatypeS01Repository` | ||||
| - Or, standard publish (selects snapshots vs releases by version): `./gradlew publish` | ||||
|  | ||||
| Notes: | ||||
| - Releases are uploaded to: https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/ | ||||
| - Snapshots are uploaded to: https://s01.oss.sonatype.org/content/repositories/snapshots/ | ||||
| - Staging/release close and promote are handled by Sonatype. If you use CI, set the env vars in your secrets. | ||||
|   | ||||
| @@ -9,7 +9,7 @@ plugins { | ||||
|  | ||||
| val PUBLISH_GROUP_ID = "com.github.adriankuta" | ||||
| val PUBLISH_ARTIFACT_ID = "tree-structure" | ||||
| val PUBLISH_VERSION = "3.0" | ||||
| val PUBLISH_VERSION = "3.1.0" | ||||
|  | ||||
| val secretFile = File(rootProject.rootDir, "local.properties") | ||||
| if (secretFile.exists()) { | ||||
| @@ -21,6 +21,10 @@ if (secretFile.exists()) { | ||||
|         project.ext[name.toString()] = value | ||||
|     } | ||||
| } else { | ||||
|     // Prefer Central Portal credentials via environment variables | ||||
|     project.ext["centralUsername"] = System.getenv("CENTRAL_USERNAME") | ||||
|     project.ext["centralPassword"] = System.getenv("CENTRAL_PASSWORD") | ||||
|     // Fallback legacy OSSRH credentials (still supported on s01) | ||||
|     project.ext["ossrhUsername"] = System.getenv("OSSRH_USERNAME") | ||||
|     project.ext["ossrhPassword"] = System.getenv("OSSRH_PASSWORD") | ||||
|     project.ext["sonatypeStagingProfileId"] = System.getenv("SONATYPE_STAGING_PROFILE_ID") | ||||
| @@ -74,15 +78,29 @@ publishing { | ||||
|  | ||||
|     repositories { | ||||
|         maven { | ||||
|             name = "Sonatype" | ||||
|             val releasesRepoUrl = "https://oss.sonatype.org/service/local/staging/deploy/maven2" | ||||
|             val snapshotsRepoUrl = "https://oss.sonatype.org/content/repositories/snapshots" | ||||
|             name = "SonatypeS01" | ||||
|             // s01 is the supported Nexus host for Central publishing via Maven-compatible uploads | ||||
|             val releasesRepoUrl = "https://s01.oss.sonatype.org/service/local/staging/deploy/maven2/" | ||||
|             val snapshotsRepoUrl = "https://s01.oss.sonatype.org/content/repositories/snapshots/" | ||||
|             url = uri(if (version.toString().endsWith("SNAPSHOT")) snapshotsRepoUrl else releasesRepoUrl) | ||||
|             credentials { | ||||
|                 // Prefer Central Portal credentials when provided, fallback to legacy OSSRH credentials | ||||
|                 val centralUsername: String? by project | ||||
|                 val centralPassword: String? by project | ||||
|                 val CENTRAL_USERNAME: String? by project | ||||
|                 val CENTRAL_PASSWORD: String? by project | ||||
|                 val ossrhUsername: String? by project | ||||
|                 val ossrhPassword: String? by project | ||||
|                 username = ossrhUsername | ||||
|                 password = ossrhPassword | ||||
|                 username = centralUsername | ||||
|                     ?: CENTRAL_USERNAME | ||||
|                     ?: ossrhUsername | ||||
|                     ?: System.getenv("CENTRAL_USERNAME") | ||||
|                     ?: System.getenv("OSSRH_USERNAME") | ||||
|                 password = centralPassword | ||||
|                     ?: CENTRAL_PASSWORD | ||||
|                     ?: ossrhPassword | ||||
|                     ?: System.getenv("CENTRAL_PASSWORD") | ||||
|                     ?: System.getenv("OSSRH_PASSWORD") | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| @@ -118,6 +136,12 @@ kotlin { | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     // Add iOS targets | ||||
|     iosX64() | ||||
|     iosArm64() | ||||
|     iosSimulatorArm64() | ||||
|  | ||||
|     val hostOs = System.getProperty("os.name") | ||||
|     val isMingwX64 = hostOs.startsWith("Windows") | ||||
|     val nativeTarget = when { | ||||
| @@ -127,7 +151,6 @@ kotlin { | ||||
|         else -> throw GradleException("Host OS is not supported in Kotlin/Native.") | ||||
|     } | ||||
|  | ||||
|  | ||||
|     sourceSets { | ||||
|         val commonMain by getting | ||||
|         val commonTest by getting { | ||||
| @@ -135,11 +158,29 @@ kotlin { | ||||
|                 implementation(kotlin("test")) | ||||
|             } | ||||
|         } | ||||
|         val jvmMain by getting | ||||
|         val jvmMain by getting { | ||||
|             dependencies { | ||||
|                 implementation(kotlin("script-runtime")) | ||||
|             } | ||||
|         } | ||||
|         val jvmTest by getting | ||||
|         val jsMain by getting | ||||
|         val jsTest by getting | ||||
|         val nativeMain by getting | ||||
|         val nativeTest by getting | ||||
|  | ||||
|         // Shared iOS source sets | ||||
|         val iosMain by creating { | ||||
|             dependsOn(commonMain) | ||||
|         } | ||||
|         val iosTest by creating { | ||||
|             dependsOn(commonTest) | ||||
|         } | ||||
|         val iosX64Main by getting { dependsOn(iosMain) } | ||||
|         val iosArm64Main by getting { dependsOn(iosMain) } | ||||
|         val iosSimulatorArm64Main by getting { dependsOn(iosMain) } | ||||
|         val iosX64Test by getting { dependsOn(iosTest) } | ||||
|         val iosArm64Test by getting { dependsOn(iosTest) } | ||||
|         val iosSimulatorArm64Test by getting { dependsOn(iosTest) } | ||||
|     } | ||||
| } | ||||
|   | ||||
							
								
								
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										
											BIN
										
									
								
								gradle/wrapper/gradle-wrapper.jar
									
									
									
									
										vendored
									
									
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										4
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								gradle/wrapper/gradle-wrapper.properties
									
									
									
									
										vendored
									
									
								
							| @@ -1,5 +1,7 @@ | ||||
| distributionBase=GRADLE_USER_HOME | ||||
| distributionPath=wrapper/dists | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip | ||||
| distributionUrl=https\://services.gradle.org/distributions/gradle-8.5-bin.zip | ||||
| networkTimeout=10000 | ||||
| validateDistributionUrl=true | ||||
| zipStoreBase=GRADLE_USER_HOME | ||||
| zipStorePath=wrapper/dists | ||||
|   | ||||
							
								
								
									
										41
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										41
									
								
								gradlew
									
									
									
									
										vendored
									
									
								
							| @@ -55,7 +55,7 @@ | ||||
| #       Darwin, MinGW, and NonStop. | ||||
| # | ||||
| #   (3) This script is generated from the Groovy template | ||||
| #       https://github.com/gradle/gradle/blob/master/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt | ||||
| #       https://github.com/gradle/gradle/blob/HEAD/subprojects/plugins/src/main/resources/org/gradle/api/internal/plugins/unixStartScript.txt | ||||
| #       within the Gradle project. | ||||
| # | ||||
| #       You can find Gradle at https://github.com/gradle/gradle/. | ||||
| @@ -80,13 +80,11 @@ do | ||||
|     esac | ||||
| done | ||||
|  | ||||
| APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit | ||||
|  | ||||
| APP_NAME="Gradle" | ||||
| # This is normally unused | ||||
| # shellcheck disable=SC2034 | ||||
| APP_BASE_NAME=${0##*/} | ||||
|  | ||||
| # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||
| DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | ||||
| # Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036) | ||||
| APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit | ||||
|  | ||||
| # Use the maximum available, or set MAX_FD != -1 to use that value. | ||||
| MAX_FD=maximum | ||||
| @@ -133,22 +131,29 @@ location of your Java installation." | ||||
|     fi | ||||
| else | ||||
|     JAVACMD=java | ||||
|     which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||
|     if ! command -v java >/dev/null 2>&1 | ||||
|     then | ||||
|         die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||
|  | ||||
| Please set the JAVA_HOME variable in your environment to match the | ||||
| location of your Java installation." | ||||
|     fi | ||||
| fi | ||||
|  | ||||
| # Increase the maximum file descriptors if we can. | ||||
| if ! "$cygwin" && ! "$darwin" && ! "$nonstop" ; then | ||||
|     case $MAX_FD in #( | ||||
|       max*) | ||||
|         # In POSIX sh, ulimit -H is undefined. That's why the result is checked to see if it worked. | ||||
|         # shellcheck disable=SC2039,SC3045 | ||||
|         MAX_FD=$( ulimit -H -n ) || | ||||
|             warn "Could not query maximum file descriptor limit" | ||||
|     esac | ||||
|     case $MAX_FD in  #( | ||||
|       '' | soft) :;; #( | ||||
|       *) | ||||
|         # In POSIX sh, ulimit -n is undefined. That's why the result is checked to see if it worked. | ||||
|         # shellcheck disable=SC2039,SC3045 | ||||
|         ulimit -n "$MAX_FD" || | ||||
|             warn "Could not set maximum file descriptor limit to $MAX_FD" | ||||
|     esac | ||||
| @@ -193,11 +198,15 @@ if "$cygwin" || "$msys" ; then | ||||
|     done | ||||
| fi | ||||
|  | ||||
| # Collect all arguments for the java command; | ||||
| #   * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of | ||||
| #     shell script including quotes and variable substitutions, so put them in | ||||
| #     double quotes to make sure that they get re-expanded; and | ||||
| #   * put everything else in single quotes, so that it's not re-expanded. | ||||
|  | ||||
| # Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. | ||||
| DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' | ||||
|  | ||||
| # Collect all arguments for the java command: | ||||
| #   * DEFAULT_JVM_OPTS, JAVA_OPTS, JAVA_OPTS, and optsEnvironmentVar are not allowed to contain shell fragments, | ||||
| #     and any embedded shellness will be escaped. | ||||
| #   * For example: A user cannot expect ${Hostname} to be expanded, as it is an environment variable and will be | ||||
| #     treated as '${Hostname}' itself on the command line. | ||||
|  | ||||
| set -- \ | ||||
|         "-Dorg.gradle.appname=$APP_BASE_NAME" \ | ||||
| @@ -205,6 +214,12 @@ set -- \ | ||||
|         org.gradle.wrapper.GradleWrapperMain \ | ||||
|         "$@" | ||||
|  | ||||
| # Stop when "xargs" is not available. | ||||
| if ! command -v xargs >/dev/null 2>&1 | ||||
| then | ||||
|     die "xargs is not available" | ||||
| fi | ||||
|  | ||||
| # Use "xargs" to parse quoted args. | ||||
| # | ||||
| # With -n1 it outputs one arg per line, with the quotes and backslashes removed. | ||||
|   | ||||
							
								
								
									
										15
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										15
									
								
								gradlew.bat
									
									
									
									
										vendored
									
									
								
							| @@ -14,7 +14,7 @@ | ||||
| @rem limitations under the License. | ||||
| @rem | ||||
|  | ||||
| @if "%DEBUG%" == "" @echo off | ||||
| @if "%DEBUG%"=="" @echo off | ||||
| @rem ########################################################################## | ||||
| @rem | ||||
| @rem  Gradle startup script for Windows | ||||
| @@ -25,7 +25,8 @@ | ||||
| if "%OS%"=="Windows_NT" setlocal | ||||
|  | ||||
| set DIRNAME=%~dp0 | ||||
| if "%DIRNAME%" == "" set DIRNAME=. | ||||
| if "%DIRNAME%"=="" set DIRNAME=. | ||||
| @rem This is normally unused | ||||
| set APP_BASE_NAME=%~n0 | ||||
| set APP_HOME=%DIRNAME% | ||||
|  | ||||
| @@ -40,7 +41,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome | ||||
|  | ||||
| set JAVA_EXE=java.exe | ||||
| %JAVA_EXE% -version >NUL 2>&1 | ||||
| if "%ERRORLEVEL%" == "0" goto execute | ||||
| if %ERRORLEVEL% equ 0 goto execute | ||||
|  | ||||
| echo. | ||||
| echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. | ||||
| @@ -75,13 +76,15 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar | ||||
|  | ||||
| :end | ||||
| @rem End local scope for the variables with windows NT shell | ||||
| if "%ERRORLEVEL%"=="0" goto mainEnd | ||||
| if %ERRORLEVEL% equ 0 goto mainEnd | ||||
|  | ||||
| :fail | ||||
| rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of | ||||
| rem the _cmd.exe /c_ return code! | ||||
| if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 | ||||
| exit /b 1 | ||||
| set EXIT_CODE=%ERRORLEVEL% | ||||
| if %EXIT_CODE% equ 0 set EXIT_CODE=1 | ||||
| if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% | ||||
| exit /b %EXIT_CODE% | ||||
|  | ||||
| :mainEnd | ||||
| if "%OS%"=="Windows_NT" endlocal | ||||
|   | ||||
| @@ -1,11 +1,20 @@ | ||||
| package com.github.adriankuta.datastructure.tree | ||||
|  | ||||
| import com.github.adriankuta.datastructure.tree.TreeNodeIterators.* | ||||
| import com.github.adriankuta.datastructure.tree.exceptions.TreeNodeException | ||||
| import com.github.adriankuta.datastructure.tree.iterators.LevelOrderTreeIterator | ||||
| import com.github.adriankuta.datastructure.tree.iterators.PostOrderTreeIterator | ||||
| import com.github.adriankuta.datastructure.tree.iterators.PreOrderTreeIterator | ||||
| import com.github.adriankuta.datastructure.tree.iterators.TreeNodeIterators | ||||
| import com.github.adriankuta.datastructure.tree.iterators.TreeNodeIterators.* | ||||
| import kotlin.jvm.JvmSynthetic | ||||
|  | ||||
| open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationInterface<T> { | ||||
| /** | ||||
|  * @param treeIterator Choose one of available iterators from [TreeNodeIterators] | ||||
|  */ | ||||
| open class TreeNode<T>(val value: T, var treeIterator: TreeNodeIterators = PreOrder) : Iterable<TreeNode<T>>, ChildDeclarationInterface<T> { | ||||
|  | ||||
|     private var _parent: TreeNode<T>? = null | ||||
|  | ||||
|     /** | ||||
|      * The converse notion of a child, an immediate ancestor. | ||||
|      */ | ||||
| @@ -13,6 +22,7 @@ open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationIn | ||||
|         get() = _parent | ||||
|  | ||||
|     private val _children = mutableListOf<TreeNode<T>>() | ||||
|  | ||||
|     /** | ||||
|      * A group of nodes with the same parent. | ||||
|      */ | ||||
| @@ -20,9 +30,11 @@ open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationIn | ||||
|         get() = _children | ||||
|  | ||||
|     /** | ||||
|      * Choose one of available iterators from [TreeNodeIterators] | ||||
|      * Checks whether the current tree node is the root of the tree | ||||
|      * @return `true` if the current tree node is root of the tree, `false` otherwise. | ||||
|      */ | ||||
|     var defaultIterator: TreeNodeIterators = PreOrder | ||||
|     val isRoot: Boolean | ||||
|         get() = _parent == null | ||||
|  | ||||
|     /** | ||||
|      * Add new child to current node or root. | ||||
| @@ -37,7 +49,8 @@ open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationIn | ||||
|     @JvmSynthetic | ||||
|     override fun child(value: T, childDeclaration: ChildDeclaration<T>?): TreeNode<T> { | ||||
|         val newChild = TreeNode(value) | ||||
|         if(childDeclaration != null) | ||||
|         newChild._parent = this | ||||
|         if (childDeclaration != null) | ||||
|             newChild.childDeclaration() | ||||
|         _children.add(newChild) | ||||
|         return newChild | ||||
| @@ -91,6 +104,31 @@ open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationIn | ||||
|         return depth | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Returns the collection of nodes, which connect the current node | ||||
|      * with its descendants | ||||
|      * | ||||
|      * @param descendant the bottom child node for which the path is calculated | ||||
|      * @return collection of nodes, which connect the current node with its descendants | ||||
|      * @throws TreeNodeException exception that may be thrown in case if the | ||||
|      *                           current node does not have such descendant or if the | ||||
|      *                           specified tree node is root | ||||
|      */ | ||||
|     @Throws(TreeNodeException::class) | ||||
|     fun path(descendant: TreeNode<T>): List<TreeNode<T>> { | ||||
|  | ||||
|         val path = mutableListOf<TreeNode<T>>() | ||||
|         var node = descendant | ||||
|         path.add(node) | ||||
|         while (!node.isRoot) { | ||||
|             node = node.parent!! | ||||
|             path.add(node) | ||||
|             if (node == this) | ||||
|                 return path | ||||
|         } | ||||
|         throw TreeNodeException("The specified tree node $descendant is not the descendant of tree node $this") | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Remove all children from root and every node in tree. | ||||
|      */ | ||||
| @@ -126,9 +164,9 @@ open class TreeNode<T>(val value: T) : Iterable<TreeNode<T>>, ChildDeclarationIn | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * You can change default iterator by changing [defaultIterator] property. | ||||
|      * You can change default iterator by changing [treeIterator] property. | ||||
|      */ | ||||
|     override fun iterator(): Iterator<TreeNode<T>> = when (defaultIterator) { | ||||
|     override fun iterator(): Iterator<TreeNode<T>> = when (treeIterator) { | ||||
|         PreOrder -> PreOrderTreeIterator(this) | ||||
|         PostOrder -> PostOrderTreeIterator(this) | ||||
|         LevelOrder -> LevelOrderTreeIterator(this) | ||||
|   | ||||
| @@ -1,5 +1,6 @@ | ||||
| package com.github.adriankuta.datastructure.tree | ||||
|  | ||||
| import com.github.adriankuta.datastructure.tree.iterators.TreeNodeIterators | ||||
| import kotlin.jvm.JvmSynthetic | ||||
|  | ||||
| typealias ChildDeclaration<T> = ChildDeclarationInterface<T>.() -> Unit | ||||
| @@ -18,8 +19,7 @@ inline fun <reified T> tree( | ||||
|     defaultIterator: TreeNodeIterators = TreeNodeIterators.PreOrder, | ||||
|     childDeclaration: ChildDeclaration<T> | ||||
| ): TreeNode<T> { | ||||
|     val treeNode = TreeNode(root) | ||||
|     treeNode.defaultIterator = defaultIterator | ||||
|     val treeNode = TreeNode(root, defaultIterator) | ||||
|     treeNode.childDeclaration() | ||||
|     return treeNode | ||||
| } | ||||
| @@ -0,0 +1,6 @@ | ||||
| package com.github.adriankuta.datastructure.tree.exceptions | ||||
|  | ||||
| import kotlin.jvm.JvmOverloads | ||||
|  | ||||
| class TreeNodeException @JvmOverloads constructor(message: String? = null, cause: Throwable? = null) : | ||||
|     RuntimeException(message, cause) | ||||
| @@ -1,4 +1,6 @@ | ||||
| package com.github.adriankuta.datastructure.tree | ||||
| package com.github.adriankuta.datastructure.tree.iterators | ||||
| 
 | ||||
| import com.github.adriankuta.datastructure.tree.TreeNode | ||||
| 
 | ||||
| /** | ||||
|  * Tree is iterated by using `Level-order Traversal Algorithm" | ||||
| @@ -1,4 +1,6 @@ | ||||
| package com.github.adriankuta.datastructure.tree | ||||
| package com.github.adriankuta.datastructure.tree.iterators | ||||
| 
 | ||||
| import com.github.adriankuta.datastructure.tree.TreeNode | ||||
| 
 | ||||
| /** | ||||
|  * Tree is iterated by using `Post-order Traversal Algorithm" | ||||
| @@ -1,4 +1,6 @@ | ||||
| package com.github.adriankuta.datastructure.tree | ||||
| package com.github.adriankuta.datastructure.tree.iterators | ||||
| 
 | ||||
| import com.github.adriankuta.datastructure.tree.TreeNode | ||||
| 
 | ||||
| /** | ||||
|  * Tree is iterated by using `Pre-order Traversal Algorithm" | ||||
| @@ -1,4 +1,4 @@ | ||||
| package com.github.adriankuta.datastructure.tree | ||||
| package com.github.adriankuta.datastructure.tree.iterators | ||||
| 
 | ||||
| /** | ||||
|  * @see PreOrder | ||||
| @@ -1,5 +1,6 @@ | ||||
| package com.github.adriankuta.datastructure.tree | ||||
|  | ||||
| import com.github.adriankuta.datastructure.tree.iterators.TreeNodeIterators | ||||
| import kotlin.test.Test | ||||
| import kotlin.test.assertContentEquals | ||||
| import kotlin.test.assertEquals | ||||
|   | ||||
							
								
								
									
										14
									
								
								src/jvmMain/kotlin/Example.ws.kts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/jvmMain/kotlin/Example.ws.kts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| import com.github.adriankuta.datastructure.tree.tree | ||||
|  | ||||
| val root = | ||||
|     tree("World") { | ||||
|         child("North America") { | ||||
|             child("USA") | ||||
|         } | ||||
|         child("Europe") { | ||||
|             child("Poland") | ||||
|             child("Germany") | ||||
|         } | ||||
|     } | ||||
|  | ||||
| print(root.prettyString()) | ||||
		Reference in New Issue
	
	Block a user