简单实现的二叉排序树


/**
 * 
 * 简单实现的二叉排序树
 */
public class Tree
{
      public Node root;


      //插入节点,关键是要找到插入节点的父节点,插入边的方向
      public void addNode ( int data, String sdata )
      {
            Node newNode = new Node(data, sdata);
            if ( root == null )
            {
                  root = newNode;
                  return;
            }
            Node parent = null; //父节点
            Node current = root;
            boolean isLeftFlag = true;//插入边方向


            //找到叶子节点作为插入父节点
            while ( current != null )
            {
                  parent = current;
                  if ( data > current.data )
                  {
                        current = current.rightChild;
                        isLeftFlag = false;
                  }
                  else if ( data < current.data )
                  {
                        current = current.leftChild;
                        isLeftFlag = true;
                  }
                  else
                  {
                        return; //相同元素排除
                  }
            }
            //插入节点
            if ( isLeftFlag )
            {
                  parent.leftChild = newNode;
            }
            else
            {
                  parent.rightChild = newNode;
            }


      }


      //中序遍历
      public static void inOrder ( Node node )
      {
            if ( node != null )
            {
                  inOrder(node.leftChild);
                  System.out.println(node.data);
                  inOrder(node.rightChild);


            }


      }


      /**
       *   首先确认删除元素的父节点,以及边的方向
       * 
       *   删除节点要考虑 ,节点是否有子节点,
       *   
       *   一个子节点,子节点直接替换
       *   有两子节点,用中序后继节点替换 
       * 
       * */
      public Node deleteNode ( int data )
      {


            Node parent = root;
            Node current = root;
            boolean isLeftFlag = true;
            while ( current.data != data )
            {
                  parent = current;
                  if ( data > current.data )
                  {
                        current = current.rightChild;
                        isLeftFlag = false;
                  }
                  else
                  {
                        current = current.leftChild;
                        isLeftFlag = true;
                  }
                  if ( current == null )
                  {
                        return null;
                  }


            }


            //没有子节点
            if ( current.leftChild == null && current.rightChild == null )
            {
                  if ( root == current )
                  {
                        root = null;
                  }
                  else
                  {
                        if(isLeftFlag)
                        {
                             parent.leftChild=null;    
                        }
                        else
                        {
                              parent.rightChild=null;
                        }
                  }
            }
            else if ( current.leftChild == null )//有右子节点
            {
                  if ( current == root )
                  {
                        root =current.rightChild;
                  }
                  else
                  {
                        if(isLeftFlag)
                        {
                             parent.leftChild=current.rightChild;    
                        }
                        else
                        {
                              parent.rightChild=current.rightChild;
                        }
                  }


            }
            else if ( current.rightChild == null )//有左子节点
            {
                  if ( current == root )
                  {
                        root =current.leftChild;
                  }
                  else
                  {
                        if(isLeftFlag)
                        {
                             parent.leftChild=current.leftChild;    
                        }
                        else
                        {
                              parent.rightChild=current.leftChild;
                        }
                  }
            }
            else
            //有两子节点
            {
                  Node parentTempNode = current;
                  //替换节点 ,右子树最小的节点
                  Node tempNode = current;
                  Node currNode = tempNode.rightChild;
                  while ( currNode != null )
                  {
                        parentTempNode=tempNode;
                        tempNode = currNode;
                        currNode = currNode.leftChild;
                  }
                  
                  //当前删除节点右节点有左子树 ,没有就不用替换
                  if ( tempNode!= current.rightChild )
                  {
                        parentTempNode.leftChild=tempNode.rightChild;//最后一个左节点的右节点 赋值给 上一个节点的左子树
                        tempNode.rightChild=current.rightChild;


                  }
                  
                  tempNode.leftChild=current.leftChild;//左子树不变动  
                  
                  if(root==current)
                  {
                        root=tempNode;
                  }
                  else
                  {
                        if(isLeftFlag)
                        {
                             parent.leftChild=tempNode;  
                        }
                        else
                        {
                              parent.rightChild=tempNode;
                        }   
                        
                  }
                   
            }


            return current;
      }
      
      


      public Node getNode ( int data )
      {
            Node current = root;//从根节点开始查找
            //如果跟当前节点的值不相等,就一直找下去
            while ( current.data != data )
            {
                  if ( data > current.data )
                  {
                        current = current.rightChild;//查找右子节点
                  }
                  else if ( data < current.data )
                  {
                        current = current.leftChild;
                  }
                  //找不到
                  if ( current == null )
                  {
                        return null;
                  }
            }
            return current;
      }


      public static void main ( String [] args )
      {
            Tree tree = new Tree();
            tree.addNode(10, "zhangsan");
            tree.addNode(8, "lisi");
            tree.addNode(5, "wangwu");
            tree.addNode(9, "kkey");
            System.out.println(tree.getNode(10).sdata);
            inOrder(tree.root);
          //  tree.deleteNode(8) ;
            tree.deleteNode(10) ; 
            System.out.println("--------------------");
            inOrder(tree.root);
      }


}


/**节点*/

public class Node

{
      public int data;
      public String sdata;
      public Node leftChild;
      public Node rightChild;


      public Node ( int Data,String sdata )
      {
            this.data = Data;
            this.sdata=sdata;
      }


}
内容概要:本文系统介绍了算术优化算法(AOA)的基本原理、核心思想及Python实现方法,并通过图像分割的实际案例展示了其应用价值。AOA是一种基于种群的元启发式算法,其核心思想来源于四则运算,利用乘除运算进行全局勘探,加减运算进行局部开发,通过数学优化器加速函数(MOA)和数学优化概率(MOP)动态控制搜索过程,在全局探索与局部开发之间实现平衡。文章详细解析了算法的初始化、勘探与开发阶段的更新策略,并提供了完整的Python代码实现,结合Rastrigin函数进行测试验证。进一步地,以Flask框架搭建前后端分离系统,将AOA应用于图像分割任务,展示了其在实际工程中的可行性与高效性。最后,通过收敛速度、寻优精度等指标评估算法性能,并提出自适应参数调整、模型优化和并行计算等改进策略。; 适合人群:具备一定Python编程基础和优化算法基础知识的高校学生、科研人员及工程技术人员,尤其适合从事人工智能、图像处理、智能优化等领域的从业者;; 使用场景及目标:①理解元启发式算法的设计思想与实现机制;②掌握AOA在函数优化、图像分割等实际问题中的建模与求解方法;③学习如何将优化算法集成到Web系统中实现工程化应用;④为算法性能评估与改进提供实践参考; 阅读建议:建议读者结合代码逐行调试,深入理解算法流程中MOA与MOP的作用机制,尝试在不同测试函数上运行算法以观察性能差异,并可进一步扩展图像分割模块,引入更复杂的预处理或后处理技术以提升分割效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值