diff --git a/contents/tree_traversal/code/smalltalk/tree_traversal.st b/contents/tree_traversal/code/smalltalk/tree_traversal.st
new file mode 100644
index 000000000..411e5ff45
--- /dev/null
+++ b/contents/tree_traversal/code/smalltalk/tree_traversal.st
@@ -0,0 +1,81 @@
+Object subclass: #Node
+    instanceVariableNames: 'children data'
+    classVariableNames: ''
+    package: ''
+
+Node>>children
+    "Children getter."
+    ^ children
+
+Node>>children: newChildren
+    "Children setter."
+    children := newChildren.
+
+Node>>data
+    "Data getter"
+    ^ data
+
+Node>>data: newData
+    "Data setter"
+    data := newData.
+
+Node>>dfsRecursive
+    "Recursive depth first search."
+    Transcript show: data; cr.
+    children collect: [ :child | child dfsRecursive ]
+
+Node>>dfsRecursivePostOrder
+    "Recursive depth first search (post-order)."
+    children collect: [ :child | (child dfsRecursivePostOrder)].
+    Transcript show: data; cr.
+ 
+Node>>dfsInOrderBinaryTree
+    "Recursive depth first search on a binary tree in order."
+    children size > 2 ifTrue: [
+        Transcript show: 'This is not a binary tree!'; cr.
+        ^self.
+    ].
+    children size = 2 ifTrue: [
+        (children at: 1) dfsInOrderBinaryTree: value.
+    ].
+    Transcript show: data; cr.
+    children size >= 1 ifTrue: [
+        (children at: 0) dfsInOrderBinaryTree: value.
+    ].
+    ^self.
+
+Node>>dfsStack
+    "Depth-first search with a stack."
+    | stack top |
+    stack := Stack new.
+    stack push: self.
+    [stack size > 0] whileTrue: [
+        top := stack pop.
+	Transcript show: (top data); cr.
+        top children reverseDo: [ :child |
+            stack push: child.
+        ].
+    ].
+
+Node>>bfs
+    "A breadth-first tree search using queues."
+    | queue current |
+    queue := LinkedList with: self.
+    [ queue size > 0 ] whileTrue: [
+        current := queue first.
+	queue removeFirst.
+	Transcript show: (current data); cr.
+	current children collect: [ :child |
+	    queue addLast: child
+        ].
+     ].
+
+| test |
+test := Node new: 1 children: { Node new: 2.
+                                Node new: 3 children: { Node new: 4.
+                                                        Node new: 5. } }.
+test dfsRecursive.
+test dfsRecursivePostorder.
+test dfsInOrderBinaryTree.
+test dfsStack.
+test bfs.
diff --git a/contents/tree_traversal/tree_traversal.md b/contents/tree_traversal/tree_traversal.md
index 2864f512e..918755495 100644
--- a/contents/tree_traversal/tree_traversal.md
+++ b/contents/tree_traversal/tree_traversal.md
@@ -32,6 +32,8 @@ As a note, a `node` struct is not necessary in javascript, so this is an example
 [import:4-37, lang:"php"](code/php/tree_traversal.php)
 {% sample lang="crystal" %}
 [import:1-5, lang:"crystal"](code/crystal/tree-traversal.cr)
+{% sample lang="st" %}
+[import:1-20, lang:"smalltalk"](code/smalltalk/tree_traversal.st)
 {% sample lang="go" %}
 [import:5-8, lang:"go"](code/golang/treetraversal.go)
 {% sample lang="asm-x64" %}
@@ -72,6 +74,8 @@ Because of this, the most straightforward way to traverse the tree might be recu
 [import:41-49, lang:"php"](code/php/tree_traversal.php)
 {% sample lang="crystal" %}
 [import:7-10, lang:"crystal"](code/crystal/tree-traversal.cr)
+{% sample lang="st" %}
+[import:22-27, lang:"smalltalk"](code/smalltalk/tree_traversal.st)
 {% sample lang="go" %}
 [import:10-15, lang:"go"](code/golang/treetraversal.go)
 {% sample lang="asm-x64" %}
@@ -120,6 +124,8 @@ Now, in this case the first element searched through is still the root of the tr
 [import:51-57, lang:"php"](code/php/tree_traversal.php)
 {% sample lang="crystal" %}
 [import:12-15, lang:"crystal"](code/crystal/tree-traversal.cr)
+{% sample lang="st" %}
+[import:29-34, lang:"smalltalk"](code/smalltalk/tree_traversal.st)
 {% sample lang="go" %}
 [import:17-22, lang:"go"](code/golang/treetraversal.go)
 {% sample lang="asm-x64" %}
@@ -163,6 +169,8 @@ In this case, the first node visited is at the bottom of the tree and moves up t
 [import:59-78, lang:"php"](code/php/tree_traversal.php)
 {% sample lang="crystal" %}
 [import:17-31, lang:"crystal"](code/crystal/tree-traversal.cr)
+{% sample lang="st" %}
+[import:36-49, lang:"smalltalk"](code/smalltalk/tree_traversal.st)
 {% sample lang="go" %}
 [import:24-38, lang:"go"](code/golang/treetraversal.go)
 {% sample lang="asm-x64" %}
@@ -216,6 +224,8 @@ In code, it looks like this:
 [import:80-91, lang:"php"](code/php/tree_traversal.php)
 {% sample lang="crystal" %}
 [import:33-41, lang:"crystal"](code/crystal/tree-traversal.cr)
+{% sample lang="st" %}
+[import:47-58, lang:"smalltalk"](code/smalltalk/tree_traversal.st)
 {% sample lang="go" %}
 [import:40-49, lang:"go"](code/golang/treetraversal.go)
 {% sample lang="asm-x64" %}
@@ -261,6 +271,8 @@ And this is exactly what Breadth-First Search (BFS) does! On top of that, it can
 [import:93-104, lang:"php"](code/php/tree_traversal.php)
 {% sample lang="crystal" %}
 [import:43-51, lang:"crystal"](code/crystal/tree-traversal.cr)
+{% sample lang="st" %}
+[import:60-71, lang:"smalltalk"](code/smalltalk/tree_traversal.st)
 {% sample lang="go" %}
 [import:51-60, lang:"go"](code/golang/treetraversal.go)
 {% sample lang="asm-x64" %}
@@ -316,6 +328,8 @@ The code snippets were taken from this [Scratch project](https://scratch.mit.edu
 [import, lang:"php"](code/php/tree_traversal.php)
 {% sample lang="crystal" %}
 [import, lang:"crystal"](code/crystal/tree-traversal.cr)
+{% sample lang="st" %}
+[import, lang:"smalltalk"](code/smalltalk/tree_traversal.st)
 {% sample lang="go" %}
 [import, lang:"go"](code/golang/treetraversal.go)
 {% sample lang="asm-x64" %}