Trees
Build a Binary Tree
Create a fixed seven-node binary tree and render its shape.
Algorithm
The canonical tree is 4(2(1,3),6(5,7)), so this R DSA
implementation can be compared directly with the rest of the DSA track.
node links
A node stores one value plus references to its left and right children.
Basic Implementation
basic.R
Replay: real traced execution (multi-file project)
node <- function(value, left = NULL, right = NULL) list(value = value, left = left, right = right)
render <- function(n) {
if (is.null(n)) return("_")
if (is.null(n$left) && is.null(n$right)) return(as.character(n$value))
paste0(n$value, "(", render(n$left), ",", render(n$right), ")")
}
sample_tree <- function() node(4, node(2, node(1), node(3)), node(6, node(5), node(7)))
list_string <- function(values) paste0("[", paste(values, collapse = ", "), "]")
cat(render(sample_tree()), "\n", sep = "")
node ← 1, tree ← 1
1node <- function(value, left = NULL, right = NULL) list(value = value, left = left, right = right)2render <- function(n) {values this step1node1treenode ← 3, tree ← 1, 3
1node <- function(value, left = NULL, right = NULL) list(value = value, left = left, right = right)2render <- function(n) {values this step3node1, 3treenode ← 2, tree ← 2(1,3)
1node <- function(value, left = NULL, right = NULL) list(value = value, left = left, right = right)2render <- function(n) {values this step2node2(1,3)treenode ← 5, tree ← 2(1,3), 5
1node <- function(value, left = NULL, right = NULL) list(value = value, left = left, right = right)2render <- function(n) {values this step5node2(1,3), 5treenode ← 7, tree ← 2(1,3), 5, 7
1node <- function(value, left = NULL, right = NULL) list(value = value, left = left, right = right)2render <- function(n) {values this step7node2(1,3), 5, 7treenode ← 6, tree ← 2(1,3), 6(5,7)
1node <- function(value, left = NULL, right = NULL) list(value = value, left = left, right = right)2render <- function(n) {values this step6node2(1,3), 6(5,7)treenode ← 4, tree ← 4(2(1,3),6(5,7))
1node <- function(value, left = NULL, right = NULL) list(value = value, left = left, right = right)2render <- function(n) {values this step4node4(2(1,3),6(5,7))treestdout ← 4(2(1,3),6(5,7))
8list_string <- function(values) paste0("[", paste(values, collapse = ", "), "]")9cat(render(sample_tree()), "\n", sep = "")values this step4(2(1,3),6(5,7))stdout4(2(1,3),6(5,7))tree
Complexity
- Time: O(n)
- Space: O(n)
Implementation notes
node <- function(value, left = NULL, right = NULL) list(...)builds each tree node as an R list withvalue,left, andrightfields.sample_tree()directly nests the calls:node(4, node(2, node(1), node(3)), node(6, node(5), node(7))).- In that call, the second argument is the left child and the third argument is
the right child. So
node(2, node(1), node(3))forms2(1,3), andnode(6, node(5), node(7))forms6(5,7).
Replay steps
left side: 1, 3 -> 2(1,3)
right side: 5, 7 -> 6(5,7)
root: 4 links both sides -> 4(2(1,3),6(5,7))
render()returns_forNULL,as.character(n$value)for a leaf, andpaste0(n$value, "(", render(n$left), ",", render(n$right), ")")for an internal node.cat(render(sample_tree()), "\n", sep = "")prints exactly4(2(1,3),6(5,7)).