二叉排序树的java实现,java二叉树排序算法

本文目录一览:

java构建二叉树算法

//******************************************************************************************************//

//*****本程序包括简单的二叉树类的实现和前序,中序,后序,层次遍历二叉树算法,*******//

//******以及确定二叉树的高度,制定对象在树中的所处层次以及将树中的左右***********//

//******孩子节点对换位置,返回叶子节点个数删除叶子节点,并输出所删除的叶子节点**//

//*******************************CopyRight By phoenix*******************************************//

//************************************Jan 12,2008*************************************************//

//****************************************************************************************************//

public class BinTree {

public final static int MAX=40;

private Object data; //数据元数

private BinTree left,right; //指向左,右孩子结点的链

BinTree []elements = new BinTree[MAX];//层次遍历时保存各个节点

int front;//层次遍历时队首

int rear;//层次遍历时队尾

public BinTree()

{

}

public BinTree(Object data)

{ //构造有值结点

this.data = data;

left = right = null;

}

public BinTree(Object data,BinTree left,BinTree right)

{ //构造有值结点

this.data = data;

this.left = left;

this.right = right;

}

public String toString()

{

return data.toString();

}//前序遍历二叉树

public static void preOrder(BinTree parent){

if(parent == null)

return;

System.out.print(parent.data+” “);

preOrder(parent.left);

preOrder(parent.right);

}//中序遍历二叉树

public void inOrder(BinTree parent){

if(parent == null)

return;

inOrder(parent.left);

System.out.print(parent.data+” “);

inOrder(parent.right);

}//后序遍历二叉树

public void postOrder(BinTree parent){

if(parent == null)

return;

postOrder(parent.left);

postOrder(parent.right);

System.out.print(parent.data+” “);

}// 层次遍历二叉树

public void LayerOrder(BinTree parent)

{

elements[0]=parent;

front=0;rear=1;

while(frontrear)

{

try

{

if(elements[front].data!=null)

{

System.out.print(elements[front].data + ” “);

if(elements[front].left!=null)

elements[rear++]=elements[front].left;

if(elements[front].right!=null)

elements[rear++]=elements[front].right;

front++;

}

}catch(Exception e){break;}

}

}//返回树的叶节点个数

public int leaves()

{

if(this == null)

return 0;

if(left == nullright == null)

return 1;

return (left == null ? 0 : left.leaves())+(right == null ? 0 : right.leaves());

}//结果返回树的高度

public int height()

{

int heightOfTree;

if(this == null)

return -1;

int leftHeight = (left == null ? 0 : left.height());

int rightHeight = (right == null ? 0 : right.height());

heightOfTree = leftHeightrightHeight?rightHeight:leftHeight;

return 1 + heightOfTree;

}

//如果对象不在树中,结果返回-1;否则结果返回该对象在树中所处的层次,规定根节点为第一层

public int level(Object object)

{

int levelInTree;

if(this == null)

return -1;

if(object == data)

return 1;//规定根节点为第一层

int leftLevel = (left == null?-1:left.level(object));

int rightLevel = (right == null?-1:right.level(object));

if(leftLevel0rightLevel0)

return -1;

levelInTree = leftLevelrightLevel?rightLevel:leftLevel;

return 1+levelInTree;

}

//将树中的每个节点的孩子对换位置

public void reflect()

{

if(this == null)

return;

if(left != null)

left.reflect();

if(right != null)

right.reflect();

BinTree temp = left;

left = right;

right = temp;

}// 将树中的所有节点移走,并输出移走的节点

public void defoliate()

{

String innerNode = “”;

if(this == null)

return;

//若本节点是叶节点,则将其移走

if(left==nullright == null)

{

System.out.print(this + ” “);

data = null;

return;

}

//移走左子树若其存在

if(left!=null){

left.defoliate();

left = null;

}

//移走本节点,放在中间表示中跟移走…

innerNode += this + ” “;

data = null;

//移走右子树若其存在

if(right!=null){

right.defoliate();

right = null;

}

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

BinTree e = new BinTree(“E”);

BinTree g = new BinTree(“G”);

BinTree h = new BinTree(“H”);

BinTree i = new BinTree(“I”);

BinTree d = new BinTree(“D”,null,g);

BinTree f = new BinTree(“F”,h,i);

BinTree b = new BinTree(“B”,d,e);

BinTree c = new BinTree(“C”,f,null);

BinTree tree = new BinTree(“A”,b,c);

System.out.println(“前序遍历二叉树结果: “);

tree.preOrder(tree);

System.out.println();

System.out.println(“中序遍历二叉树结果: “);

tree.inOrder(tree);

System.out.println();

System.out.println(“后序遍历二叉树结果: “);

tree.postOrder(tree);

System.out.println();

System.out.println(“层次遍历二叉树结果: “);

tree.LayerOrder(tree);

System.out.println();

System.out.println(“F所在的层次: “+tree.level(“F”));

System.out.println(“这棵二叉树的高度: “+tree.height());

System.out.println(“————————————–“);

tree.reflect();

System.out.println(“交换每个节点的孩子节点后……”);

System.out.println(“前序遍历二叉树结果: “);

tree.preOrder(tree);

System.out.println();

System.out.println(“中序遍历二叉树结果: “);

tree.inOrder(tree);

System.out.println();

System.out.println(“后序遍历二叉树结果: “);

tree.postOrder(tree);

System.out.println();

System.out.println(“层次遍历二叉树结果: “);

tree.LayerOrder(tree);

System.out.println();

System.out.println(“F所在的层次: “+tree.level(“F”));

System.out.println(“这棵二叉树的高度: “+tree.height());

}

二叉排序树(BST) Java实现

public class NodeE {

int key; // data used as key value

E data; // other data

NodeE leftChild; // this node’s left child

NodeE rightChild; // this node’s right child

public Node(int key, E o) {

this.key = key;

this.data = o;

}

public void displayNode() {

System.out.printf(“%d, %s\n”, key, data.toString());

}

}

===============================================================

package net.acoder.adt.tree;

public class TreeE {

private NodeE root;

public Tree(NodeE root) {

if (root == null) {

throw new NullPointerException(“root can’t be null”);

}

this.root = root;

}

public Tree(int key, E o) {

this(new NodeE(key, o));

}

public NodeE getRoot() {

return root;

}

/**

* find a node by its key

*

* @param key

* @return

*/

public NodeE find(int key) {

NodeE current = root;

while (current.key != key) {

if (key current.key) {

current = root.leftChild;

} else {

current = root.rightChild;

}

if (current == null) {

return null;

}

}

return current;

}

/**

* insert a node to this tree

*

* @param key

* @param o

*/

public void insert(int key, E o) {

NodeE aNode = new NodeE(key, o);

if (root == null) {

this.root = aNode;

return;

}

NodeE current = root;

NodeE parent = root;

while (true) {

parent = current;

if (key parent.key) {

current = parent.leftChild;

if (current == null) {

parent.leftChild = aNode;

return;

}

} else {

current = parent.rightChild;

if (current == null) {

parent.rightChild = aNode;

return;

}

}

}

}

public boolean delete(int key) {

NodeE current = root;

NodeE parent = root;

boolean isLeftChild = true;

// search for node

while (current.key != key) {

parent = current;

if (key current.key) {

isLeftChild = true;

current = current.leftChild;

} else {

isLeftChild = false;

current = current.rightChild;

}

if (current == null) {

return false;

}

}

// if no children, simply delete it

if (current.leftChild == null current.rightChild == null) {

if (current == parent) {

root = null;

} else if (isLeftChild == true) {

parent.leftChild = null;

} else if (isLeftChild == false) {

parent.rightChild = null;

}

return true;

}

// if no left children, replace with right subtree

if (current.leftChild == null) {

if (current == root) {

root = current.rightChild;

} else if (isLeftChild) {

parent.leftChild = current.rightChild;

} else if (!isLeftChild) {

parent.leftChild = current.rightChild;

}

return true;

}

// if no right children, replace with left subtree

if (current.rightChild == null) {

if (current == root) {

root = current.leftChild;

} else if (isLeftChild) {

parent.leftChild = current.leftChild;

} else if (!isLeftChild) {

parent.leftChild = current.leftChild;

}

return true;

}

// get successor of node to delete

NodeE successor = getSuccessor(current);

if (current == root) {

current = successor;

} else if (isLeftChild) {

parent.leftChild = successor;

} else {

parent.rightChild = successor;

}

successor.leftChild = current.leftChild;

return true;

}

private NodeE getSuccessor(NodeE delNode) {

NodeE successorParent = delNode;

NodeE successor = delNode;

NodeE current = delNode.rightChild;

while (current != null) {

successorParent = successor;

successor = current;

current = current.leftChild;

}

if (successor != delNode.rightChild) {

successorParent.leftChild = successor.rightChild;

successor.rightChild = delNode.rightChild;

}

return successor;

}

public void inOrder(NodeE aNode) {

if (aNode != null) {

inOrder(aNode.leftChild);

aNode.displayNode();

inOrder(aNode.rightChild);

}

}

public void preOrder(NodeE aNode) {

if (aNode != null) {

aNode.displayNode();

inOrder(aNode.leftChild);

inOrder(aNode.rightChild);

}

}

public void backOrder(NodeE aNode) {

if (aNode != null) {

inOrder(aNode.leftChild);

inOrder(aNode.rightChild);

aNode.displayNode();

}

}

public NodeE minimum() {

NodeE current = this.root;

NodeE result = null;

while (current != null) {

result = current;

current = current.leftChild;

}

return result;

}

public NodeE maximum() {

NodeE current = this.root;

NodeE result = null;

while (current != null) {

result = current;

current = current.rightChild;

}

return result;

}

}

以前的代码, 记得没写完, 好像就是BST

用java怎么构造一个二叉树呢?

java构造二叉树,可以通过链表来构造,如下代码:

public class BinTree {

public final static int MAX=40;

BinTree []elements = new BinTree[MAX];//层次遍历时保存各个节点

    int front;//层次遍历时队首

    int rear;//层次遍历时队尾

private Object data; //数据元数

private BinTree left,right; //指向左,右孩子结点的链

public BinTree()

{

}

public BinTree(Object data)

{ //构造有值结点

   this.data = data;

   left = right = null;

}

public BinTree(Object data,BinTree left,BinTree right)

{ //构造有值结点

   this.data = data;

   this.left = left;

   this.right = right;

}

public String toString()

{

   return data.toString();

}

//前序遍历二叉树

public static void preOrder(BinTree parent){ 

     if(parent == null)

      return;

     System.out.print(parent.data+” “);

     preOrder(parent.left);

     preOrder(parent.right);

}

//中序遍历二叉树

public void inOrder(BinTree parent){

   if(parent == null)

      return;

   inOrder(parent.left);

   System.out.print(parent.data+” “);

     inOrder(parent.right);

}

//后序遍历二叉树

public void postOrder(BinTree parent){

   if(parent == null)

    return;

   postOrder(parent.left);

   postOrder(parent.right);

   System.out.print(parent.data+” “);

}

// 层次遍历二叉树 

public void LayerOrder(BinTree parent)

     elements[0]=parent;

     front=0;rear=1;

   while(frontrear)

   {

    try

    {

        if(elements[front].data!=null)

        {

           System.out.print(elements[front].data + ” “);

           if(elements[front].left!=null)

          elements[rear++]=elements[front].left;

           if(elements[front].right!=null)

          elements[rear++]=elements[front].right;

           front++;

        }

    }catch(Exception e){break;}

   }

}

//返回树的叶节点个数

public int leaves()

{

   if(this == null)

    return 0;

   if(left == nullright == null)

    return 1;

   return (left == null ? 0 : left.leaves())+(right == null ? 0 : right.leaves());

}

//结果返回树的高度

public int height()

{

   int heightOfTree;

   if(this == null)

    return -1;

   int leftHeight = (left == null ? 0 : left.height());

   int rightHeight = (right == null ? 0 : right.height());

   heightOfTree = leftHeightrightHeight?rightHeight:leftHeight;

   return 1 + heightOfTree;

}

//如果对象不在树中,结果返回-1;否则结果返回该对象在树中所处的层次,规定根节点为第一层

public int level(Object object)

{

   int levelInTree;

   if(this == null)

    return -1;

   if(object == data)

    return 1;//规定根节点为第一层

   int leftLevel = (left == null?-1:left.level(object));

   int rightLevel = (right == null?-1:right.level(object));

   if(leftLevel0rightLevel0)

    return -1;

   levelInTree = leftLevelrightLevel?rightLevel:leftLevel;

   return 1+levelInTree;

  

}

//将树中的每个节点的孩子对换位置

public void reflect()

{

   if(this == null)

    return;

   if(left != null)

    left.reflect();

   if(right != null)

    right.reflect();

   BinTree temp = left;

   left = right;

   right = temp;

}

// 将树中的所有节点移走,并输出移走的节点

public void defoliate()

{

   if(this == null)

    return;

   //若本节点是叶节点,则将其移走

   if(left==nullright == null)

   {

    System.out.print(this + ” “);

    data = null;

    return;

   }

   //移走左子树若其存在

   if(left!=null){

    left.defoliate();

    left = null;

   }

   //移走本节点,放在中间表示中跟移走…

   String innerNode += this + ” “;

   data = null;

   //移走右子树若其存在

   if(right!=null){

    right.defoliate();

    right = null;

   }

}

   /**

* @param args

*/

public static void main(String[] args) {

   // TODO Auto-generated method stub

   BinTree e = new BinTree(“E”);

   BinTree g = new BinTree(“G”);

   BinTree h = new BinTree(“H”);

   BinTree i = new BinTree(“I”);

   BinTree d = new BinTree(“D”,null,g);

  

   BinTree f = new BinTree(“F”,h,i);

   BinTree b = new BinTree(“B”,d,e);

   BinTree c = new BinTree(“C”,f,null);

   BinTree tree = new BinTree(“A”,b,c);

  

        System.out.println(“前序遍历二叉树结果: “);

        tree.preOrder(tree);

        System.out.println();

        System.out.println(“中序遍历二叉树结果: “);

        tree.inOrder(tree);

        System.out.println();

        System.out.println(“后序遍历二叉树结果: “);

        tree.postOrder(tree);

        System.out.println();

      System.out.println(“层次遍历二叉树结果: “);

     tree.LayerOrder(tree);

     System.out.println();

        System.out.println(“F所在的层次: “+tree.level(“F”));

        System.out.println(“这棵二叉树的高度: “+tree.height());

         System.out.println(“————————————–“);

         tree.reflect();

          System.out.println(“交换每个节点的孩子节点后……”);

          System.out.println(“前序遍历二叉树结果: “);

        tree.preOrder(tree);

        System.out.println();

        System.out.println(“中序遍历二叉树结果: “);

        tree.inOrder(tree);

        System.out.println();

        System.out.println(“后序遍历二叉树结果: “);

        tree.postOrder(tree);

        System.out.println();

      System.out.println(“层次遍历二叉树结果: “);

     tree.LayerOrder(tree);

     System.out.println();

        System.out.println(“F所在的层次: “+tree.level(“F”));

        System.out.println(“这棵二叉树的高度: “+tree.height());

}

二叉排序树的插入与查找 求Java大神帮忙

//二叉树结构类    Btree.java

public class Btree {

private int data;

private Btree left;

private Btree right;

public void setData(int data) {

this.data = data;

}

public int getData() {

return data;

}

public void setLeft(Btree btree) {

this.left = btree;

}

public void setRight(Btree btree) {

this.right = btree;

}

public Btree getLeft() {

return left;

}

public Btree getRight() {

return right;

}

public Btree() {

super();

}

}

//工具类,二叉树创建,查找,遍历,排序。都在这了 Tools.java

public class Tools {

public Btree create(int data) {

Btree btree = new Btree();

btree.setData(data);

return btree;

}

public void add(Btree btree, int data) {

if (data  btree.getData()) {

if (btree.getLeft() != null) {

btree = btree.getLeft();

add(btree, data);

} else {

btree.setLeft(create(data));

}

} else {

if (btree.getRight() != null) {

btree = btree.getRight();

add(btree, data);

} else {

btree.setRight(create(data));

}

}

}

//中序遍历

public void midSerch(Btree btree) {

if (btree.getLeft() != null)

midSerch(btree.getLeft());

System.out.print(btree.getData()+” “);

if (btree.getRight() != null)

midSerch(btree.getRight());

}

//二叉树查找

public void find(Btree btree ,int data){

if(btree.getData()data)

{

if(btree.getLeft()==null)

{

System.out.println(“没有这种结果,搜索完毕”);

return;

}else

find(btree.getLeft(),data);

}else if(btree.getData()==data)

{

System.out.println(“查找成功,查找到的数据是”+data);

return;

}else

{

if(btree.getRight()==null){

System.out.println(“没有这种结果,搜索完毕”);

return;

}

else

find(btree.getRight(),data);

}

}

}

//主类,与注释的自己看  MidSerchBtree.java

public class MidSerchBtree {

public static void main(String args[]) {

Tools tools = new Tools();

int datas[] = { 6, 4, 3, 7, 8, 9, 2, 1, 5,8,9,12,23,45,3,7,5 };

Btree btree = tools.create(datas[0]);

for (int i = 1; i  datas.length; i++) {//第一个初始化插入作为根节点了

tools.add(btree, datas[i]);

}

tools.midSerch(btree);//中根遍历     小的插入左边,大的在右边,所以,中序遍历一遍就是排序

tools.find(btree, 56);

}

}

原创文章,作者:小蓝,如若转载,请注明出处:https://www.506064.com/n/305221.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小蓝小蓝
上一篇 2025-01-01 11:07
下一篇 2025-01-01 11:07

相关推荐

  • java client.getacsresponse 编译报错解决方法

    java client.getacsresponse 编译报错是Java编程过程中常见的错误,常见的原因是代码的语法错误、类库依赖问题和编译环境的配置问题。下面将从多个方面进行分析…

    编程 2025-04-29
  • Java JsonPath 效率优化指南

    本篇文章将深入探讨Java JsonPath的效率问题,并提供一些优化方案。 一、JsonPath 简介 JsonPath是一个可用于从JSON数据中获取信息的库。它提供了一种DS…

    编程 2025-04-29
  • 蝴蝶优化算法Python版

    蝴蝶优化算法是一种基于仿生学的优化算法,模仿自然界中的蝴蝶进行搜索。它可以应用于多个领域的优化问题,包括数学优化、工程问题、机器学习等。本文将从多个方面对蝴蝶优化算法Python版…

    编程 2025-04-29
  • Java腾讯云音视频对接

    本文旨在从多个方面详细阐述Java腾讯云音视频对接,提供完整的代码示例。 一、腾讯云音视频介绍 腾讯云音视频服务(Cloud Tencent Real-Time Communica…

    编程 2025-04-29
  • Java Bean加载过程

    Java Bean加载过程涉及到类加载器、反射机制和Java虚拟机的执行过程。在本文中,将从这三个方面详细阐述Java Bean加载的过程。 一、类加载器 类加载器是Java虚拟机…

    编程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介绍

    本文将详细介绍Java Milvus SearchParam withoutFields的相关知识和用法。 一、什么是Java Milvus SearchParam without…

    编程 2025-04-29
  • Python实现爬楼梯算法

    本文介绍使用Python实现爬楼梯算法,该算法用于计算一个人爬n级楼梯有多少种不同的方法。 有一楼梯,小明可以一次走一步、两步或三步。请问小明爬上第 n 级楼梯有多少种不同的爬楼梯…

    编程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java语言中的一个版本,于2014年3月18日发布。本文将从多个方面对Java 8中某一周的周一进行详细的阐述。 一、数组处理 Java 8新特性之一是Stream…

    编程 2025-04-29
  • AES加密解密算法的C语言实现

    AES(Advanced Encryption Standard)是一种对称加密算法,可用于对数据进行加密和解密。在本篇文章中,我们将介绍C语言中如何实现AES算法,并对实现过程进…

    编程 2025-04-29
  • Java判断字符串是否存在多个

    本文将从以下几个方面详细阐述如何使用Java判断一个字符串中是否存在多个指定字符: 一、字符串遍历 字符串是Java编程中非常重要的一种数据类型。要判断字符串中是否存在多个指定字符…

    编程 2025-04-29

发表回复

登录后才能评论