Skip to content

Instantly share code, notes, and snippets.

@totechite
Last active March 8, 2019 12:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save totechite/9e2a88dc38a3a6853db54b43497150de to your computer and use it in GitHub Desktop.
Save totechite/9e2a88dc38a3a6853db54b43497150de to your computer and use it in GitHub Desktop.
Rust-二分探索木
use std::boxed::Box;
#[derive(Debug)]
pub struct Node
{
data: isize,
left: Option<Box<Node>>,
right: Option<Box<Node>>,
}
impl Node
{
pub fn new(num: isize) -> Self
{
Self {
data: num,
left: None,
right: None,
}
}
pub fn insert(&mut self, num: isize)
{
if &self.data > &num { //Left Node
if let Some(left_node) = &mut self.left {
left_node.insert(num);
} else {
let node = Self::new(num);
self.left = Some(Box::new(node));
}
} else if &self.data < &num { //Right Node
if let Some(right_node) = &mut self.right {
right_node.insert(num);
} else {
let node = Self::new(num);
self.right = Some(Box::new(node));
}
} else {} //既にある場合なにもしない
}
pub fn search(&self, num: isize) -> bool
{
if &self.data > &num { //Left Node
if let Some(left_node) = &self.left {
left_node.search(num)
} else { false }
} else if &self.data < &num { //Right Node
if let Some(right_node) = &self.right {
right_node.search(num)
} else { false }
} else { true }
}
pub fn delete(&mut self, num: isize) -> Option<isize>
{
let mut log = vec![];
if &self.data > &num { //Left Node
if let Some(left_node) = &mut self.left {
if left_node.data == num { // 一致した場合削除処理に進む
left_node.delete_impl(&mut log);
self.left = None; //削除
for n in log.iter() {
self.insert(*n);
};
return Some(num);
}
left_node.delete(num) //子ノードを探索
} else { None }
} else if &self.data < &num { //Right Node
if let Some(right_node) = &mut self.right {
if right_node.data == num {
right_node.delete_impl(&mut log);
self.right = None;
for n in log.iter() {
self.insert(*n);
};
return Some(num);
}
right_node.delete(num)
} else { None }
} else {
self.delete_impl(&mut log);
self.left = None;
self.right = None;
for n in log.iter() {
self.insert(*n);
};
return Some(num);
}
}
fn delete_impl(&self, log: &mut Vec<isize>)
{
//削除されるノード以下を全探索して、データをリストに保存する
//Left Node
if let Some(left_node) = &self.left {
log.push(left_node.data);
left_node.delete_impl(log);
};
//Right Node
if let Some(right_node) = &self.right {
log.push(right_node.data);
right_node.delete_impl(log);
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment