Rust二叉搜索树

节点的结构

#[derive(Debug, Clone)]
struct TreeNode<T> {
    pub data: T,
    pub left: Option<Box<TreeNode<T>>>,
    pub right: Option<Box<TreeNode<T>>>,
}

impl<T> TreeNode<T>
where
    T: PartialOrd + Display + Copy,
{
    #[inline]
    fn new(data: T) -> Self {
        TreeNode {
            data,
            left: None,
            right: None,
        }
    }
}

插入

  fn insert(&mut self, data: T) {
        if data < self.data {
            if let Some(left) = &mut self.left {
                left.insert(data);
            } else {
                self.left = Some(Box::new(TreeNode::new(data)));
            }
        } else if data > self.data {
            if let Some(right) = &mut self.right {
                right.insert(data);
            } else {
                self.right = Some(Box::new(TreeNode::new(data)));
            }
        } else { 
        }
    }

查找

按目标查找

    fn find(&mut self, target: T) -> Option<&mut Self> {
        if target < self.data {
            if let Some(left) = &mut self.left {
                return left.find(target);
            } else {
                // not found
                return None;
            }
        } else if target > self.data {
            if let Some(right) = &mut self.right {
                return right.find(target);
            } else {
                // not found
                return None;
            }
        } else {
            return Some(self);
        }
    }

查找最大值最小值

 fn find_min(&self) -> Option<&Self> {
        if self.left.is_some() {
            return self.left.as_ref().unwrap().find_min();
        } else {
            return Some(self);
        }
    }
    fn find_max(&self) -> Option<&Self> {
        if self.right.is_some() {
            return self.right.as_ref().unwrap().find_max();
        } else {
            return Some(self);
        }
    }

获取节点的数量和树的深度

 pub fn get_node_num(&self) -> usize {
        let left = match &self.left {
            None => 0,
            Some(node) => node.get_node_num(),
        };
        let right = match &self.right {
            None => 0,
            Some(node) => node.get_node_num(),
        };
        return 1 + left + right;
    }
    pub fn get_depth(&self) -> usize {
        let left = match &self.left {
            None => 0,
            Some(node) => node.get_depth(),
        };
        let right = match &self.right {
            None => 0,
            Some(node) => node.get_depth(),
        };
        if left > right {
            return left + 1;
        } else {
            return right + 1;
        }
    }

遍历

前序遍历

   fn pre_order(&self) {
        println!("{}", self.data);
        if let Some(left) = &self.left {
            left.pre_order()
        }
        if let Some(right) = &self.right {
            right.pre_order()
        }
    }

中序遍历

输出的结果是排好序的

  fn infix_order(&self) {
        if let Some(left) = &self.left {
            left.infix_order()
        }
        println!("{}", self.data);
        if let Some(right) = &self.right {
            right.infix_order()
        }
    }

后序遍历

 fn after_order(&self) {
        if let Some(left) = &self.left {
            left.after_order()
        }
        if let Some(right) = &self.right {
            right.after_order()
        }
        println!("{}", self.data);
    }

层序遍历

通过 vec模拟队列来实现

 fn level_order(&self) {
        let mut queue = Vec::new(); //初始化队列
        queue.push(self); //根结点入队列
        while !queue.is_empty() {
            let a = queue.remove(0);
            println!("{}", a.data);
            if let Some(b) = &a.left {
                queue.push(b.as_ref());
            }
            if let Some(b) = &a.right {
                queue.push(b.as_ref());
            }
        }
    }

节点删除不会,如果您会的话,可以在评论区告诉我吗?

源码地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值