代码之家  ›  专栏  ›  技术社区  ›  Evgeni Nabokov

用锈迹斑斑的孙子节点替换BST的子节点

  •  0
  • Evgeni Nabokov  · 技术社区  · 4 年前

    我正在尝试删除一个节点。当节点没有子节点时,我只需修改父节点的左侧或右侧。当节点有左子树或右子树时,如何删除节点并保留其子树?

    下面是TreeNode的实现:

    use std::rc::Rc;
    use std::cell::RefCell;
    
    // Definition for a binary tree node.
    #[derive(Debug, PartialEq, Eq)]
    pub struct TreeNode {
      pub val: i32,
      pub left: Option<Rc<RefCell<TreeNode>>>,
      pub right: Option<Rc<RefCell<TreeNode>>>,
    }
    
    impl TreeNode {
      #[inline]
      pub fn new(val: i32) -> Self {
        TreeNode {
          val,
          left: None,
          right: None
        }
      }
    }
    

    实现是给定的,不能更改。

    1 回复  |  直到 4 年前
        1
  •  -1
  •   Evgeni Nabokov    4 年前

    我自己想出来的:

    let right_node = node.as_mut().unwrap().borrow_mut().right.take().unwrap(); // It may be the left child.
    node.replace(right_node);