二叉树-删除节点

本文介绍了二叉树中删除节点的方法,特别是针对叶子节点和非叶子节点的删除策略。并提供了具体的测试用例(删除5号叶子节点和3号节点)及相应的代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

要求

  1. 如果删除的节点是叶子节点,则删除该节点。
  2. 如果删除的节点是非叶子节点,则删除树。

测试

删除5号叶子节点和3号树。
在这里插入图片描述

代码实现

package chapter18.binarytree

object BinaryTreeDemo {
  def main(args: Array[String]): Unit = {
    //先使用比较简单的方法,直接关联
    val root = new HeroNode(1, "宋江")
    val hero2 = new HeroNode(2, "吴用")
    val hero3 = new HeroNode(3, "卢俊义")
    val hero4 = new HeroNode(4, "林冲")
    val hero5 = new HeroNode(5, "关胜")
    root.left = hero2
    root.right = hero3
    hero3.left = hero5
    hero3.right = hero4

    val binaryTree = new BinaryTree
    binaryTree.root = root

    //测试删除节点
    binaryTree.delNode(5)
    println("前序遍历")
    binaryTree.preOrder()

  }
}

//定义节点
class HeroNode(hNo: Int, hName: String) {
  val no = hNo
  var name = hName
  var left: HeroNode = null
  var right: HeroNode = null

  //删除节点
  //1)如果删除的节点是叶子节点,则删除该节点。
  //2)如果删除的节点是非叶子节点,则删除树。
  def delNode(no: Int): Unit = {
    //首先比较当前节点左子节点是否为要删除的节点
    if (this.left != null && this.left.no == no) {
      this.left = null
      return
    }
    //首先比较当前节点右子节点是否为要删除的节点
    if (this.right != null && this.right.no == no) {
      this.right = null
      return
    }
    //向左递归删除
    if (this.left != null) {
      this.left.delNode(no)
    }
    //向右递归删除
    if (this.right != null) {
      this.right.delNode(no)
    }
  }


  //前序遍历
  def preOrder(): Unit = {
    //先输出当前节点的值
    println(s"节点信息 no=${no} name = ${name}")
    //向左递归,输出左子树
    if (this.left != null) {
      this.left.preOrder()
    }
    //向右递归,输出右子树
    if (this.right != null) {
      this.right.preOrder()
    }
  }
 }

//二叉树
class BinaryTree {
  var root: HeroNode = null

  //删除节点
  def delNode(no: Int): Unit = {
    if (root != null) {
      //先处理一下root是不是要删除的
      if (root.no == no) {
        root = null
      } else {
        root.delNode(no)
      }
    }
  }

  //前序遍历
  def preOrder() = {
    if (root != null) {
      root.preOrder()
    } else {
      println("当前二叉树为空,不能遍历")
    }
  }
}

代码实现

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值