11-二叉树排序树-Scala实现
二叉排序树的创建、遍历、删除
package com.atguigu.datastructures.binarytree
/**
* 二叉排序树的创建和遍历
* 删除,1.删除叶子节点,因为二叉排序树是单向的,需要在删除时,找到删除节点的父节点
* 2.先检索要删除节点,如果没有找到就退出;反之,找到该节点的父节点
* 3.删除该节点
*/
//Array(7,3,10,12,5,1,9)
object BinarySortTreeDemo {
def main(args: Array[String]): Unit = {
val arr=Array(7,3,10)
val binarySortTree = new BinarySortTree
for (elem <- arr) {
binarySortTree.add(new Node(elem))
}
binarySortTree.infixOrder()
//删除
binarySortTree.delNode(10)
binarySortTree.delNode(3)
println("删除后")
binarySortTree.infixOrder()
}
}
//定义节点
class Node(var value:Int){
var left:Node = null
var right:Node = null
//根据值来查找某个节点
def search(value:Int):Node={
//先判断当前节点是否是要删除的节点
if(value == this.value){
return this
}else if(value < this.value){//向左递归查找
if(this.left == null){
return null
}else{
return this.left.search(value)
}
}else{
if (this.right == null){
null
}else{//否则向右递归查找
this.right.search(value)
}
}
}
//找某个节点的父节点
def searchParent(value:Int):Node={
//思路
//1.先判断当前节点的左子节点或者右子节点是否是这个值
if((this.left != null && this.left.value == value) ||
(this.right != null && this.right.value == value)
){
this
}else{
if (this.left != null && value < this.value){//说明要向左边去递归查找
this.left.searchParent(value)
}else if (this.right != null && value > this.value){//说明要向左边去递归查找
this.right.searchParent(value)
}else {
null
}
}
}
//添加方法
def add(node: Node): Unit ={
if (node == null){
return
}
//如果要插入节点的值,小于当前节点的值,则可以处理
if (node.value < this.value){
if (this.left == null){//说明该节点下没有左子节点
this.left = node
}else{
//递归的进行插入
this.left.add(node)
}
}else{ //如果要插入节点的值,不小于当前节点的值,则可以处理
if (this.right == null){
this.right = node
}else{
//递归进行插入
this.right.add(node)
}
}
}
def infixOrder(): Unit ={
if (this.left != null){
this.left.infixOrder()
}
printf("节点信息 no=%d \n",value)
if (this.right != null){
this.right.infixOrder()
}
}
}
//定义二叉排序树
class BinarySortTree{
var root:Node = null
//删除某个右子树的最小值的节点,并返回最小值
def delRightTreeMin(node: Node): Int ={
var target = node
//使用while循环,找到右子树的最小值
while (target.left != null){
target = target.left
}
val minValue = target.value
delNode(minValue)
minValue
}
//查找节点
def search(value:Int):Node={
if (root != null){
root.search(value)
}else{
null
}
}
//查找父节点
def searchParent(value:Int):Node={
if (root != null){
root.searchParent(value)
}else{
null
}
}
//删除节点
//1.先考虑的是叶子节点
def delNode(value:Int): Unit ={
if (root == null){//如果是空树,就不删除
null
}
//先看有没有要删除的节点
var targetNode = search(value)
if (targetNode == null){
return
}
var parentNode = searchParent(value)
if (parentNode==null){
root = null
return
}
//1.先考虑的是叶子节点
if (targetNode.left == null && targetNode.right == null){
//判断删除的节点parentNode的左子节点,还是右子节点
if (parentNode.left != null && parentNode.left.value == value){
parentNode.left = null
}else{
parentNode.right = null
}
}else if(targetNode.left != null && targetNode.right != null){
val value: Int = delRightTreeMin(targetNode.right)
targetNode.value = value
//两个子节点
}else{
//targetNode只有一个子节点
//判断是左子节点还是右子节点
if (targetNode.left !=null){
if (parentNode.left.value == value){
parentNode.left = targetNode.left
}else{
parentNode.right = targetNode.left
}
}else{
//判断targetNode是parentNode的左还是右
if (parentNode.left.value == value){
parentNode.left = targetNode.right
}else{
parentNode.right = targetNode.right
}
}
}
}
def add(node: Node): Unit ={
if (root == null){
root = node
}else{
root.add(node)
}
}
def infixOrder(): Unit ={
if (root != null){
root.infixOrder()
}else{
println("当前树为空")
}
}
}

浙公网安备 33010602011771号