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" %}