# rust 二叉树构建


定义解构:

// 定义 TreeNode 解构
pub struct TreeNode{
    pub val: i32,
    pub left: Option<Rc<RefCell<TreeNode>>>,
    pub left: Option<Rc<RefCell<TreeNode>>>,
}
// Option<T> 是一个枚举类型,它可以包含 Some (T) 表示有值,或者 None 表示没有值。
// Rc<T> 是引用计数(Reference Counting)智能指针,用于多所有权的数据结构。在这里,它用于创建树节点的左右子树。
// RefCell<T> 是一个提供内部可变性的类型,它允许在运行时检测借用规则。在这里,它用于 Rc 中,以允许在 Rc 的内部进行可变操作。

定义 TreeNode 方法:

impl TreeNode{
    //new 方法获得类型
    pub fn new(val: i32) -> Self{
        TreeNode{
            val,
            left: None,
            right: None,
        }
    }
  
    // 构建二叉树方法
    pub fn insert(&mut self, val: i32) ->(){
        if val < self.val {
            if let Some(left) = &self.left {
                left.as_ref().borrow_mut().insert(val);
            } else{
                self.left = Some(Rc::new(ReCell::new(TreeNode::new(val))));
            }
        }else{
            if let Some(right) = &self.right {
                right.as_ref().borrow_mut().insert(val);
            }else {
                self.right = Some(Rc::new(RefCell::new(TreeNode::new(val)));
            }
        }
    } 
}

TreeNode 遍历方法:

impl TreeNode{
	// 前:根左右   中:左根右   后:左右根
    // 基于 Self 方法的前、中、后续遍历 TreeNode. 方法名 ()
	pub fn front_order(&self){ // 这里并不要 mut 遍历只读,mut 难度更大
        println!("{}",self.val);
        if let Some(node) = &self.left{ // 这里去掉了 Option 和 Rf
            node.borrow_mut().front_order();// 去掉 ReCall
        }
        if let Some(node) = &self.right{
            node.borrow_mut().front_order();
        }
    }
  
    pub fn in_order(&self){
        if let Some(node) = &self.left{
            node.borrow_mut().in_order();
        }
        println!("{}",self.val);
      
        if let Some(node) = &self.right{
            node.borrow_mut().in_order();
        }
    }
  
    pub fn back_order(&self){
        if let Some(node) = &self.left{
            node.borrow_mut().back_order();
        }
        if let Some(node) = &self.right{
            node.borrow_mut().back_order();
        }
      
        println!("{}",self.val);
    }
    // 如果这个要改为 & amp;mut self 请将 node.borrow_mut. 方法 () 替换为 node.as_ref ().borrow_mut (). 方法 (); 注意 borrow 和 borrow_mut 的区别
    // pub fn in_order(&mut self){
    //     if let Some(ref node) = &self.left { //
    //         node.as_ref().borrow_mut().in_order();
    //     }
    //     if self.val == 36 {
    //         self.val = 100;
    //     }
    //     println!("{}", self.val);
    //     if let Some(ref node) = &self.right {
    //         node.as_ref().borrow_mut().in_order();
    //     }
    // }
  
    // 基于函数的前、中、后续遍历 fn 参数不是 self
    pub fn frontorder(node: &mut Option<Rf<RefCell<TreeNode>>>){
        if let Some(node) = node{
            println!("{}",node.borrow().val);
            TreeNode::frontorder(node.as_ref().borrow_mut().left.borrow_mut());
             TreeNode::frontorder(node.as_ref().borrow_mut().right.borrow_mut());
        }
    }
  
    pub fn inorder(node: &mut Option<Rf<RefCell<TreeNode>>>){
        if let Some(node) = node{
            TreeNode::inorder(node.as_ref().borrow_mut().left.borrow_mut());
             println!("{}",node.borrow().val);
            TreeNode::inorder(node.as_ref().borrow_mut().right.borrow_mut());
        }
    }
  
    pub fn backorder(node: &mut Option<Rf<RefCell<TreeNode>>>){
        if let Some(node) = node{
            TreeNode::backorder(node.as_ref().borrow_mut().left.borrow_mut());
             println!("{}",node.borrow().val);
            TreeNode::backorder(node.as_ref().borrow_mut().right.borrow_mut());
        }
    }
}

主函数:

use std::borrow::BorrowMut;
fn main() {
    let aa = Vec::from([4,1,6,0,2,5,7,3,8]);
    let mut i=0;
    let mut root = Some(Rc::new(RefCell::new(TreeNode::new(aa[i]))));
    i+=1;
    while i <aa.len(){
        if let Some(ref root1) = root {
            root1.as_ref().borrow_mut().insert(aa[i]);
        }
        i+=1;
    }
    // root.as_ref().unwrap().as_ref().borrow_mut().insert(3);
    // root.as_ref().unwrap().as_ref().borrow_mut().insert(7);
    // root.as_ref().unwrap().as_ref().borrow_mut().insert(2);
    // root.as_ref().unwrap().as_ref().borrow_mut().insert(4);
    // root.as_ref().unwrap().as_ref().borrow_mut().insert(1);
    // println!("{:?}",root);
    println!("--------------------------------------", );
    let mut hh = Solution::bst_to_gst(root);
    println!("{:?}", hh);
    TreeNode::inorder_traversal(hh.as_ref());
    println!("back-------", );
    TreeNode::backorder_traversal(root.as_ref());
    println!("front-------", );
    TreeNode::frontorder_traversal(root.as_ref());
    println!("--------------------------------------", );
    // TreeNode::bt_backorder_traversal(root.as_ref());
    // println!("--------------------------------------", );
  
    // println!("in-------", );
root.as_ref().unwrap().as_ref().borrow_mut().in_order();
    // println!("back-------", );
root.as_ref().unwrap().as_ref().borrow_mut().back_order();
    // println!("front-------", );
root.as_ref().unwrap().as_ref().borrow_mut().front_order();
}

# 练手题目 leet1038:


img

思路:首先确定遍历顺序,这里不是更像是将 中序遍历(左根右),修改为另一种(右根左),然后累加,返回 total 值即可,所以这里首先确定使用 mut Option<Rf<RefCell <TreeNode> >> 作为参数,代码如下:

use std::rc::Rc;
use std::cell::RefCell;
use std::borrow::BorrowMut;
impl Solution {
    pub fn bst_to_gst(mut root: Option<Rc<RefCell<TreeNode>>>) -> Option<Rc<RefCell<TreeNode>>> {
        Self::bt_backorder_traversal(&mut root,0);
        root
    }
    pub fn bt_backorder_traversal(node: &mut Option<Rc<RefCell<TreeNode>>>, mut total : i32) -> i32 { 
      
        if let Some(node) = node {
            total=Self::bt_backorder_traversal(node.as_ref().borrow_mut().right.borrow_mut(), total);
            total+=node.borrow().val.clone();
          
            node.as_ref().borrow_mut().val=total;
            total=Self::bt_backorder_traversal(node.as_ref().borrow_mut().left.borrow_mut(),total);
        }
        total
    }
}
更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

Watsmal 微信支付

微信支付

Watsmal 支付宝

支付宝

Watsmal 贝宝

贝宝