Skip to content

Instantly share code, notes, and snippets.

@gevorgyana
Last active August 3, 2020 18:49
Show Gist options
  • Save gevorgyana/ffa55b837f0ec704bb3f6ebe43e9a6c0 to your computer and use it in GitHub Desktop.
Save gevorgyana/ffa55b837f0ec704bb3f6ebe43e9a6c0 to your computer and use it in GitHub Desktop.
struct Node {
left: Option<Box<Node>>,
right: Option<Box<Node>>,
value: i32,
l_size: usize,
r_size: usize,
reps: usize,
}
struct Tree {
root: Option<Box<Node>>,
}
impl Tree {
fn insert(&mut self, i: i32) {
println!("Inserting {}", i);
let mut parent: &mut Box<Node>;
match &self.root {
None => {
self.root = Some(Box::from(Node {
left: None,
right: None,
l_size: 0,
r_size: 0,
value: i,
reps: 1
}));
},
Some(root) => {
parent = self.root.as_mut().unwrap();
loop {
println!("at parent {:?}", parent.value);
std::thread::sleep(std::time::Duration::from_millis(1000));
if parent.value == i {
parent.reps += 1;
break;
} else if i < parent.value {
println!("to the left");
match &parent.left {
Some(value) => {
parent = parent.left.as_mut().unwrap();
},
None => {
parent.left = Some(Box::from(Node {
left: None,
right: None,
l_size: 0,
r_size: 0,
value: i,
reps: 1
}));
parent.l_size += 1;
break;
},
}
}
else {
println!("to the right");
match &parent.right {
Some(value) => {
parent = parent.right.as_mut().unwrap();
},
None => {
parent.right = Some(Box::from(Node {
left: None,
right: None,
l_size: 0,
r_size: 0,
value: i,
reps: 1
}));
parent.r_size += 1;
break;
},
}
}
}
}
}
}
fn find_kth(&mut self, mut offset: usize) -> Option<i32> {
println!("find kth {}", offset);
match self.root {
None => {
return None;
},
_ => (),
}
let mut parent: &mut Box<Node> = self.root.as_mut().unwrap();
loop {
println!("current offset {}", offset);
println!("# nodes to the left {}", parent.l_size);
println!("# nodes to the right {}", parent.r_size);
if parent.l_size > offset {
parent = parent.left.as_mut().unwrap();
println!("at {} ", parent.value);
} else if parent.l_size <= offset && offset < parent.l_size + parent.reps {
println!("answer: {}", parent.value);
return Some(parent.value);
} else {
println!("at {} ", parent.value);
println!("new offset: {}", offset - parent.l_size - parent.reps);
offset -= (parent.l_size + parent.reps);
parent = parent.right.as_mut().unwrap();
}
}
}
}
fn main() {
println!("Hello, world!");
}
#[cfg(test)]
mod test {
use super::*;
/*
#[test]
fn sample() {
let mut t: Tree = Tree { root: None };
t.insert(2);
t.insert(1);
t.insert(5);
t.insert(10);
t.insert(13);
assert_eq!(Some(2), t.find_kth(1));
assert_eq!(Some(1), t.find_kth(0));
assert_eq!(Some(5), t.find_kth(2));
assert_eq!(Some(10), t.find_kth(3));
assert_eq!(Some(13), t.find_kth(4));
t.insert(3);
assert_eq!(Some(3), t.find_kth(2));
}
*/
#[test]
fn repetitions() {
let mut t: Tree = Tree { root: None };
t.insert(1);
t.insert(1);
t.insert(1);
assert_eq!(t.find_kth(0), Some(1));
assert_eq!(t.find_kth(1), Some(1));
assert_eq!(t.find_kth(2), Some(1));
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment