From c8fc40df44ae260e9eedb67508ffa17600d45f5a Mon Sep 17 00:00:00 2001 From: Alokzh Date: Sat, 21 Jun 2025 10:20:29 +0530 Subject: [PATCH 1/3] Added initialisation methods & basic insertion methods with tests --- .../CTBinarySearchTreeTest.class.st | 33 ++++++++ .../CTBSTAbstractNode.class.st | 47 +++++++++++- .../CTBSTNillNode.class.st | 35 ++++++++- .../CTBSTNode.class.st | 75 ++++++++++++++++++- .../CTBinarySearchTree.class.st | 37 ++++++++- 5 files changed, 223 insertions(+), 4 deletions(-) diff --git a/src/Containers-BinarySearchTree-Tests/CTBinarySearchTreeTest.class.st b/src/Containers-BinarySearchTree-Tests/CTBinarySearchTreeTest.class.st index 40c7226..3fed398 100644 --- a/src/Containers-BinarySearchTree-Tests/CTBinarySearchTreeTest.class.st +++ b/src/Containers-BinarySearchTree-Tests/CTBinarySearchTreeTest.class.st @@ -4,6 +4,39 @@ A CTBinarySearchTreeTest is a test class for testing the behavior of CTBinarySea Class { #name : 'CTBinarySearchTreeTest', #superclass : 'TestCase', + #instVars : [ + 'tree' + ], #category : 'Containers-BinarySearchTree-Tests', #package : 'Containers-BinarySearchTree-Tests' } + +{ #category : 'running' } +CTBinarySearchTreeTest >> setUp [ + super setUp. + tree := CTBinarySearchTree new +] + +{ #category : 'tests' } +CTBinarySearchTreeTest >> testAddMultipleElements [ + + tree add: 50. + tree add: 30. + tree add: 70. + self assert: tree size equals: 3 +] + +{ #category : 'tests' } +CTBinarySearchTreeTest >> testAddSingleElement [ + + tree add: 42. + self deny: tree isEmpty. + self assert: tree size equals: 1 +] + +{ #category : 'tests' } +CTBinarySearchTreeTest >> testEmpty [ + + self assert: tree isEmpty. + self assert: tree size equals: 0 +] diff --git a/src/Containers-BinarySearchTree/CTBSTAbstractNode.class.st b/src/Containers-BinarySearchTree/CTBSTAbstractNode.class.st index 762b0ae..3c156b2 100644 --- a/src/Containers-BinarySearchTree/CTBSTAbstractNode.class.st +++ b/src/Containers-BinarySearchTree/CTBSTAbstractNode.class.st @@ -1,9 +1,54 @@ " -I represent Abstract Node for BST +I represent an abstract node for Binary Search Tree. " Class { #name : 'CTBSTAbstractNode', #superclass : 'Object', + #instVars : [ + 'parent' + ], #category : 'Containers-BinarySearchTree', #package : 'Containers-BinarySearchTree' } + +{ #category : 'adding' } +CTBSTAbstractNode >> addChild: anObject [ + + ^ self subclassResponsibility +] + +{ #category : 'accessing' } +CTBSTAbstractNode >> contents [ + + ^ self subclassResponsibility +] + +{ #category : 'accessing' } +CTBSTAbstractNode >> contents: anObject [ + + self subclassResponsibility +] + +{ #category : 'testing' } +CTBSTAbstractNode >> isEmpty [ + + ^ self subclassResponsibility +] + +{ #category : 'accessing' } +CTBSTAbstractNode >> parent [ + + ^ parent +] + +{ #category : 'accessing' } +CTBSTAbstractNode >> parent: aNode [ + + parent := aNode +] + +{ #category : 'accessing' } +CTBSTAbstractNode >> size [ + + ^ self subclassResponsibility +] diff --git a/src/Containers-BinarySearchTree/CTBSTNillNode.class.st b/src/Containers-BinarySearchTree/CTBSTNillNode.class.st index 08c4868..13e8bdc 100644 --- a/src/Containers-BinarySearchTree/CTBSTNillNode.class.st +++ b/src/Containers-BinarySearchTree/CTBSTNillNode.class.st @@ -1,5 +1,5 @@ " -I represent Nill Node for BST +I represent a nil node for Binary Search Tree. " Class { #name : 'CTBSTNillNode', @@ -7,3 +7,36 @@ Class { #category : 'Containers-BinarySearchTree', #package : 'Containers-BinarySearchTree' } + +{ #category : 'adding' } +CTBSTNillNode >> addChild: anObject [ + + ^ CTBSTNode new + contents: anObject; + parent: self parent; + yourself +] + +{ #category : 'accessing' } +CTBSTNillNode >> contents [ + + ^ nil +] + +{ #category : 'accessing' } +CTBSTNillNode >> contents: anObject [ + + "Do nothing for nil node" +] + +{ #category : 'testing' } +CTBSTNillNode >> isEmpty [ + + ^ true +] + +{ #category : 'accessing' } +CTBSTNillNode >> size [ + + ^ 0 +] diff --git a/src/Containers-BinarySearchTree/CTBSTNode.class.st b/src/Containers-BinarySearchTree/CTBSTNode.class.st index 31be0ef..2bd6de5 100644 --- a/src/Containers-BinarySearchTree/CTBSTNode.class.st +++ b/src/Containers-BinarySearchTree/CTBSTNode.class.st @@ -1,9 +1,82 @@ " -I represent Node for BST +I represent a node for Binary Search Tree. " Class { #name : 'CTBSTNode', #superclass : 'CTBSTAbstractNode', + #instVars : [ + 'contents', + 'left', + 'right' + ], #category : 'Containers-BinarySearchTree', #package : 'Containers-BinarySearchTree' } + +{ #category : 'adding' } +CTBSTNode >> addChild: anObject [ + + anObject < contents + ifTrue: [ left := left addChild: anObject ] + ifFalse: [ anObject > contents + ifTrue: [ right := right addChild: anObject ] ]. + ^ self +] + +{ #category : 'accessing' } +CTBSTNode >> contents [ + + ^ contents +] + +{ #category : 'accessing' } +CTBSTNode >> contents: anObject [ + + contents := anObject +] + +{ #category : 'initialization' } +CTBSTNode >> initialize [ + + super initialize. + left := CTBSTNillNode new parent: self. + right := CTBSTNillNode new parent: self +] + +{ #category : 'testing' } +CTBSTNode >> isEmpty [ + + ^ false +] + +{ #category : 'accessing' } +CTBSTNode >> left [ + + ^ left +] + +{ #category : 'accessing' } +CTBSTNode >> left: aNode [ + + left := aNode. + aNode parent: self +] + +{ #category : 'accessing' } +CTBSTNode >> right [ + + ^ right +] + +{ #category : 'accessing' } +CTBSTNode >> right: aNode [ + + right := aNode. + aNode parent: self +] + +{ #category : 'accessing' } +CTBSTNode >> size [ + + ^ 1 + left size + right size +] diff --git a/src/Containers-BinarySearchTree/CTBinarySearchTree.class.st b/src/Containers-BinarySearchTree/CTBinarySearchTree.class.st index 03f4061..f0df702 100644 --- a/src/Containers-BinarySearchTree/CTBinarySearchTree.class.st +++ b/src/Containers-BinarySearchTree/CTBinarySearchTree.class.st @@ -1,9 +1,44 @@ " -I represent main Binary Search Tree class +I represent a Binary Search Tree data structure. " Class { #name : 'CTBinarySearchTree', #superclass : 'Object', + #instVars : [ + 'root' + ], #category : 'Containers-BinarySearchTree', #package : 'Containers-BinarySearchTree' } + +{ #category : 'adding' } +CTBinarySearchTree >> add: anObject [ + + root := root addChild: anObject. + ^ anObject +] + +{ #category : 'initialization' } +CTBinarySearchTree >> initialize [ + + super initialize. + root := CTBSTNillNode new +] + +{ #category : 'testing' } +CTBinarySearchTree >> isEmpty [ + + ^ root isEmpty +] + +{ #category : 'accessing' } +CTBinarySearchTree >> root [ + + ^ root isEmpty ifTrue: [ nil ] ifFalse: [ root ] +] + +{ #category : 'accessing' } +CTBinarySearchTree >> size [ + + ^ root size +] From 5b9f8a546c3f72a0a82d50d89ed636f33f563108 Mon Sep 17 00:00:00 2001 From: Alokzh Date: Sat, 21 Jun 2025 11:08:29 +0530 Subject: [PATCH 2/3] Implemented basic search functionalities with `search:` & `includes:` methods --- .../CTBinarySearchTreeTest.class.st | 13 +++++++++++++ .../CTBSTAbstractNode.class.st | 6 ++++++ .../CTBSTNillNode.class.st | 6 ++++++ src/Containers-BinarySearchTree/CTBSTNode.class.st | 9 +++++++++ .../CTBinarySearchTree.class.st | 6 ++++++ 5 files changed, 40 insertions(+) diff --git a/src/Containers-BinarySearchTree-Tests/CTBinarySearchTreeTest.class.st b/src/Containers-BinarySearchTree-Tests/CTBinarySearchTreeTest.class.st index 3fed398..839a750 100644 --- a/src/Containers-BinarySearchTree-Tests/CTBinarySearchTreeTest.class.st +++ b/src/Containers-BinarySearchTree-Tests/CTBinarySearchTreeTest.class.st @@ -40,3 +40,16 @@ CTBinarySearchTreeTest >> testEmpty [ self assert: tree isEmpty. self assert: tree size equals: 0 ] + +{ #category : 'tests' } +CTBinarySearchTreeTest >> testIncludes [ + + tree add: 50. + tree add: 30. + tree add: 70. + + self assert: (tree includes: 50). + self assert: (tree includes: 30). + self assert: (tree includes: 70). + self deny: (tree includes: 99) +] diff --git a/src/Containers-BinarySearchTree/CTBSTAbstractNode.class.st b/src/Containers-BinarySearchTree/CTBSTAbstractNode.class.st index 3c156b2..59061af 100644 --- a/src/Containers-BinarySearchTree/CTBSTAbstractNode.class.st +++ b/src/Containers-BinarySearchTree/CTBSTAbstractNode.class.st @@ -47,6 +47,12 @@ CTBSTAbstractNode >> parent: aNode [ parent := aNode ] +{ #category : 'accessing' } +CTBSTAbstractNode >> search: anObject [ + + ^ self subclassResponsibility +] + { #category : 'accessing' } CTBSTAbstractNode >> size [ diff --git a/src/Containers-BinarySearchTree/CTBSTNillNode.class.st b/src/Containers-BinarySearchTree/CTBSTNillNode.class.st index 13e8bdc..034bd50 100644 --- a/src/Containers-BinarySearchTree/CTBSTNillNode.class.st +++ b/src/Containers-BinarySearchTree/CTBSTNillNode.class.st @@ -35,6 +35,12 @@ CTBSTNillNode >> isEmpty [ ^ true ] +{ #category : 'accessing' } +CTBSTNillNode >> search: anObject [ + + ^ nil +] + { #category : 'accessing' } CTBSTNillNode >> size [ diff --git a/src/Containers-BinarySearchTree/CTBSTNode.class.st b/src/Containers-BinarySearchTree/CTBSTNode.class.st index 2bd6de5..6893d84 100644 --- a/src/Containers-BinarySearchTree/CTBSTNode.class.st +++ b/src/Containers-BinarySearchTree/CTBSTNode.class.st @@ -75,6 +75,15 @@ CTBSTNode >> right: aNode [ aNode parent: self ] +{ #category : 'accessing' } +CTBSTNode >> search: anObject [ + + contents = anObject ifTrue: [ ^ contents ]. + ^ anObject < contents + ifTrue: [ left search: anObject ] + ifFalse: [ right search: anObject ] +] + { #category : 'accessing' } CTBSTNode >> size [ diff --git a/src/Containers-BinarySearchTree/CTBinarySearchTree.class.st b/src/Containers-BinarySearchTree/CTBinarySearchTree.class.st index f0df702..1953a79 100644 --- a/src/Containers-BinarySearchTree/CTBinarySearchTree.class.st +++ b/src/Containers-BinarySearchTree/CTBinarySearchTree.class.st @@ -18,6 +18,12 @@ CTBinarySearchTree >> add: anObject [ ^ anObject ] +{ #category : 'testing' } +CTBinarySearchTree >> includes: anObject [ + + ^ (root search: anObject) notNil +] + { #category : 'initialization' } CTBinarySearchTree >> initialize [ From de66350ee0e2152ea36012ef2d84ece2512b11f7 Mon Sep 17 00:00:00 2001 From: Alokzh Date: Sat, 21 Jun 2025 18:40:37 +0530 Subject: [PATCH 3/3] Implemented `inOrderDo:` `height` & `isLeaf` methods with tests --- .../CTBinarySearchTreeTest.class.st | 41 +++++++++++++++++++ .../CTBSTAbstractNode.class.st | 18 ++++++++ .../CTBSTNillNode.class.st | 18 ++++++++ .../CTBSTNode.class.st | 20 +++++++++ .../CTBinarySearchTree.class.st | 12 ++++++ 5 files changed, 109 insertions(+) diff --git a/src/Containers-BinarySearchTree-Tests/CTBinarySearchTreeTest.class.st b/src/Containers-BinarySearchTree-Tests/CTBinarySearchTreeTest.class.st index 839a750..9f9112b 100644 --- a/src/Containers-BinarySearchTree-Tests/CTBinarySearchTreeTest.class.st +++ b/src/Containers-BinarySearchTree-Tests/CTBinarySearchTreeTest.class.st @@ -41,6 +41,36 @@ CTBinarySearchTreeTest >> testEmpty [ self assert: tree size equals: 0 ] +{ #category : 'tests' } +CTBinarySearchTreeTest >> testHeight [ + + self assert: tree height equals: 0. + + tree add: 50. + self assert: tree height equals: 1. + + tree add: 30. + self assert: tree height equals: 2. + + tree add: 70. + self assert: tree height equals: 2 +] + +{ #category : 'tests' } +CTBinarySearchTreeTest >> testInOrderTraversal [ + + | result | + tree add: 50. + tree add: 30. + tree add: 70. + tree add: 20. + tree add: 40. + + result := OrderedCollection new. + tree inOrderDo: [ :each | result add: each ]. + self assert: result asArray equals: #( 20 30 40 50 70 ) +] + { #category : 'tests' } CTBinarySearchTreeTest >> testIncludes [ @@ -53,3 +83,14 @@ CTBinarySearchTreeTest >> testIncludes [ self assert: (tree includes: 70). self deny: (tree includes: 99) ] + +{ #category : 'tests' } +CTBinarySearchTreeTest >> testIsLeaf [ + + tree add: 50. + self assert: tree root isLeaf. + + tree add: 30. + self deny: tree root isLeaf. + self assert: tree root left isLeaf +] diff --git a/src/Containers-BinarySearchTree/CTBSTAbstractNode.class.st b/src/Containers-BinarySearchTree/CTBSTAbstractNode.class.st index 59061af..8487891 100644 --- a/src/Containers-BinarySearchTree/CTBSTAbstractNode.class.st +++ b/src/Containers-BinarySearchTree/CTBSTAbstractNode.class.st @@ -29,12 +29,30 @@ CTBSTAbstractNode >> contents: anObject [ self subclassResponsibility ] +{ #category : 'accessing' } +CTBSTAbstractNode >> height [ + + ^ self subclassResponsibility +] + +{ #category : 'enumerating' } +CTBSTAbstractNode >> inOrderDo: aBlock [ + + ^ self subclassResponsibility +] + { #category : 'testing' } CTBSTAbstractNode >> isEmpty [ ^ self subclassResponsibility ] +{ #category : 'testing' } +CTBSTAbstractNode >> isLeaf [ + + ^ self subclassResponsibility +] + { #category : 'accessing' } CTBSTAbstractNode >> parent [ diff --git a/src/Containers-BinarySearchTree/CTBSTNillNode.class.st b/src/Containers-BinarySearchTree/CTBSTNillNode.class.st index 034bd50..808139a 100644 --- a/src/Containers-BinarySearchTree/CTBSTNillNode.class.st +++ b/src/Containers-BinarySearchTree/CTBSTNillNode.class.st @@ -29,12 +29,30 @@ CTBSTNillNode >> contents: anObject [ "Do nothing for nil node" ] +{ #category : 'accessing' } +CTBSTNillNode >> height [ + + ^ 0 +] + +{ #category : 'enumerating' } +CTBSTNillNode >> inOrderDo: aBlock [ + + "Do nothing for nil node" +] + { #category : 'testing' } CTBSTNillNode >> isEmpty [ ^ true ] +{ #category : 'testing' } +CTBSTNillNode >> isLeaf [ + + ^ false +] + { #category : 'accessing' } CTBSTNillNode >> search: anObject [ diff --git a/src/Containers-BinarySearchTree/CTBSTNode.class.st b/src/Containers-BinarySearchTree/CTBSTNode.class.st index 6893d84..00a26c7 100644 --- a/src/Containers-BinarySearchTree/CTBSTNode.class.st +++ b/src/Containers-BinarySearchTree/CTBSTNode.class.st @@ -35,6 +35,20 @@ CTBSTNode >> contents: anObject [ contents := anObject ] +{ #category : 'accessing' } +CTBSTNode >> height [ + + ^ 1 + (left height max: right height) +] + +{ #category : 'enumerating' } +CTBSTNode >> inOrderDo: aBlock [ + + left inOrderDo: aBlock. + aBlock value: contents. + right inOrderDo: aBlock +] + { #category : 'initialization' } CTBSTNode >> initialize [ @@ -49,6 +63,12 @@ CTBSTNode >> isEmpty [ ^ false ] +{ #category : 'testing' } +CTBSTNode >> isLeaf [ + + ^ left isEmpty and: [ right isEmpty ] +] + { #category : 'accessing' } CTBSTNode >> left [ diff --git a/src/Containers-BinarySearchTree/CTBinarySearchTree.class.st b/src/Containers-BinarySearchTree/CTBinarySearchTree.class.st index 1953a79..19df61e 100644 --- a/src/Containers-BinarySearchTree/CTBinarySearchTree.class.st +++ b/src/Containers-BinarySearchTree/CTBinarySearchTree.class.st @@ -18,6 +18,18 @@ CTBinarySearchTree >> add: anObject [ ^ anObject ] +{ #category : 'accessing' } +CTBinarySearchTree >> height [ + + ^ root height +] + +{ #category : 'enumerating' } +CTBinarySearchTree >> inOrderDo: aBlock [ + + root inOrderDo: aBlock +] + { #category : 'testing' } CTBinarySearchTree >> includes: anObject [