>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 29231 个阅读者 刷新本主题
 * 贴子主题:  用Java实现二叉排序树 回复文章 点赞(0)  收藏  
作者:sunshine    发表时间:2017-07-17 18:50:20     消息  查看  搜索  好友  邮件  复制  引用

二叉排序树又称二叉查找树。本文主要对二叉排序树的实现与基本操作进行详细介绍,以下代码实现了: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);
}
}



程序猿的技术大观园:www.javathinker.net
  Java面向对象编程-->数据类型
  JavaWeb开发-->Web运作原理(Ⅳ)
  JSP与Hibernate开发-->映射对象标识符
  Java网络编程-->XML数据处理
  精通Spring-->Vue组件开发基础
  Vue3开发-->绑定CSS样式
  解密Java类文件的数据结构
  Java小白们的练手大餐:100道编程题面试题精讲(最新推出)
  Java设计模式: 里氏替换原则和合成复用原则详解
  观察者模式和发布订阅模式的区别
  Java关键字final、static使用总结
  Java 语言中十大“坑爹”功能!
  Redis安装、Redis基本数据类型、Jedis、Redis集群搭建
  java 中文繁简体转换工具 opencc4j
  Java注解的定义和使用
  Synchronized与ReentrantLock区别总结
  正则表达式性能调优
  Java 入门实用代码:设置文件只读
  JAVA日期加减运算
  【Java 并发笔记】CountDownLatch 相关整理
  java Pattern和Matcher详解
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。