二叉排序树的实现与基本操作

 更新时间:2016年12月23日 11:10:23   作者:一个弱者想变强  
二叉排序树又称二叉查找树。本文主要对二叉排序树的实现与基本操作进行详细介绍,以下代码实现了:1、二叉树的构建;2、二叉树的中、前、后、层序遍历;3、二叉树中结点的最大距离。下面就跟着小编一起来看下吧

二叉排序树又称二叉查找树。它或者是一颗空树,或者是具有以下性质的二叉树:

①如果左子树不空,那么左子树上所有结点的值均小于它的根结点的值;

②如果右子树不空,那么右子树上所有结点的值均大于它的根结点的值;

③左右子树也分别为二叉排序树。

以下代码实现了:

  • 二叉树的构建
  • 二叉树的中、前、后、层序遍历
  • 二叉树中结点的最大距离
import java.util.LinkedList;
import java.util.Queue;
class Node{
 public int data;
 public Node left;
 public Node right;
 public int leftMaxDistance;
 public int rightMaxDistance;
 public Node(int data){
 this.data=data;
 this.left=null;
 this.right=null;
 }
}
/**
 * @author TY
 * 实现二叉排序树,包括插入、中序遍历、先序遍历、后序遍历、计算所有节点的最大距离的功能
 */
public class BinaryTree {
 private Node root;
 public BinaryTree(){
 root=null;
 }
 public void insert(int data){
 Node newNode=new Node(data);
 if(root==null)
 root=newNode;
 else{
 Node current=root;
 Node parent;
 while (true) {//寻找插入位置
 parent=current;
 if(data<current.data){
 current=current.left;
 if(current==null){
 parent.left=newNode;
 return;
 }
 }else{
 current=current.right;
 if (current==null) {
 parent.right=newNode;
 return;
 }
 }
 }
 }
 }
 //将数值输入构建二叉树
 public void buildTree(int[] data){
 for (int i = 0; i < data.length; i++) {
 insert(data[i]);
 }
 }
 //中序遍历方法递归实现
 public void inOrder(Node localRoot){
 if(localRoot!=null){
 inOrder(localRoot.left);
 System.out.print(localRoot.data+" ");
 inOrder(localRoot.right);
 }
 }
 public void inOrder(){
 this.inOrder(this.root);
 }
 //先序遍历方法递归实现
 public void preOrder(Node localRoot){
 if(localRoot!=null){
 System.out.print(localRoot.data+" ");
 preOrder(localRoot.left);
 preOrder(localRoot.right);
 }
 }
 public void preOrder(){
 this.preOrder(this.root);
 }
 //后序遍历方法递归实现
 public void postOrder(Node localRoot){
 if(localRoot!=null){
 postOrder(localRoot.left);
 postOrder(localRoot.right);
 System.out.print(localRoot.data+" ");
 }
 }
 public void postOrder(){
 this.postOrder(this.root);
 }
 /**
 * 层序遍历二叉树:现将根结点放入队列中,然后每次都从队列中取一个结点打印该结点的值,
 * 若这个结点有子结点,则将它的子结点放入队列尾,直到队列为空
 */
 public void layerTranverse(){
 if(this.root==null)
 return;
 Queue<Node> q=new LinkedList<Node>();
 q.add(this.root);
 while(!q.isEmpty()){
 Node n=q.poll();
 System.out.print(n.data+" ");
 if(n.left!=null)
 q.add(n.left);
 if(n.right!=null)
 q.add(n.right);
 }
 }
 private int maxLen=0;
 private int max(int a,int b){
 return a>b?a:b;
 }
 public void findMaxDistance(Node root){
 if(root==null)
 return;
 if(root.left==null)
 root.leftMaxDistance=0;
 if(root.right==null)
 root.rightMaxDistance=0;
 if(root.left!=null)
 findMaxDistance(root.left);
 if(root.right!=null)
 findMaxDistance(root.right);
 //计算左字树中距离根结点的最大距离
 if(root.left!=null)
 root.leftMaxDistance=max(root.left.leftMaxDistance, root.left.rightMaxDistance)+1;
 //计算右字树中距离根结点的最大距离
 if(root.right!=null)
 root.rightMaxDistance=max(root.right.leftMaxDistance, root.right.rightMaxDistance)+1;
 //获取二叉树所有结点的最大距离
 if(root.leftMaxDistance+root.rightMaxDistance>maxLen){
maxLen=root.leftMaxDistance+root.rightMaxDistance;
 }
 }
 public static void main(String[] args) {
 BinaryTree biTree=new BinaryTree();
 int[] data={2,8,7,4,9,3,1,6,7,5};
 biTree.buildTree(data);
 System.out.print("二叉树的中序遍历:");
 biTree.inOrder();
 System.out.println();
 System.out.print("二叉树的先序遍历:");
 biTree.preOrder();
 System.out.println();
 System.out.print("二叉树的后序遍历:");
 biTree.postOrder();
 System.out.println();
 System.out.print("二叉树的层序遍历:");
 biTree.layerTranverse();
 System.out.println();
 biTree.findMaxDistance(biTree.root);
 System.out.println("二叉树中结点的最大距离:"+biTree.maxLen); 
 }
}

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!

相关文章

  • Java 10 局部变量类型推断浅析

    Java 10 局部变量类型推断浅析

    这篇文章主要介绍了Java 10 局部变量类型推断浅析,Java 10 引进一种新的闪闪发光的特性叫做局部变量类型推断。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,,需要的朋友可以参考下
    2019-06-06
  • 浅谈在springboot中使用定时任务的方式

    浅谈在springboot中使用定时任务的方式

    今天给大家带来的是关于Java的相关知识,文章围绕着在springboot中使用定时任务的方式展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • SpringMVC xml文件路径在web.xml中的配置方式

    SpringMVC xml文件路径在web.xml中的配置方式

    这篇文章主要介绍了SpringMVC xml文件路径在web.xml中的配置方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • springboot 中文件上传下载实例代码

    springboot 中文件上传下载实例代码

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。这篇文章主要介绍了springboot 中文件上传下载实例代码,需要的朋友可以参考下
    2017-11-11
  • SpringBoot+SpringBatch+Quartz整合定时批量任务方式

    SpringBoot+SpringBatch+Quartz整合定时批量任务方式

    这篇文章主要介绍了SpringBoot+SpringBatch+Quartz整合定时批量任务方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 使用mtrace追踪JVM堆外内存泄露的方法

    使用mtrace追踪JVM堆外内存泄露的方法

    这篇文章主要给大家介绍了如何使用mtrace追踪JVM堆外内存泄露,文章通过代码示例介绍的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2023-09-09
  • Java中map和flatMap的区别举例详解

    Java中map和flatMap的区别举例详解

    这篇文章主要给大家介绍了关于Java中map和flatMap区别的相关资料,在Java中Stream接口有map()和flatmap()方法,两者都有中间流操作,并返回另一个流作为方法输出,需要的朋友可以参考下
    2023-10-10
  • 深入探究如何使用Java编写MapReduce程序

    深入探究如何使用Java编写MapReduce程序

    MapReduce是一种用于处理大规模数据集的并行编程模型,其特点高效性和可扩展性,在本文中,我们将深入了解MapReduce,并使用Java编写一个简单的MapReduce程序,需要的朋友可以参考下
    2023-05-05
  • Java汉字转拼音案例详解

    Java汉字转拼音案例详解

    这篇文章主要介绍了Java汉字转拼音案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Java实现ArrayList自动扩容

    Java实现ArrayList自动扩容

    ArrayList的扩容规则是非常简单的,它会根据需要自动扩容,本文就来介绍一下Java实现ArrayList自动扩容,具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12

最新评论