要求
- 如果删除的节点是叶子节点,则删除该节点。
- 如果删除的节点是非叶子节点,则删除树。
测试
删除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("当前二叉树为空,不能遍历")
}
}
}