`

用java写二叉树的算法

阅读更多

class Node
{
 int iData; // data used as key value
 double dData; // other data
 Node leftChild; // this Node's left child
 Node rightChild; // this Node's right child

 public void displayNode()
 {
  // (see Listing 8.1 for method body)
  System.out.print("{" + iData + ", " + dData + "} ");
 }
}

class Tree
{
 private Node root; // the only data field in Tree

 public Node find(int key) // find Node with given key
 { // (assumes non-empty tree)
  Node current = root; // start at root
  while(current.iData != key) // while no match,
  {
   if(key < current.iData) // go left?
    current = current.leftChild;
   else
    current = current.rightChild; // or go right?
   if(current == null) // if no child,
    return null; // didn't find it
  } 
  return current; // found it
 }

 public Node minimum() // returns Node with minimum key value
 {
  Node current, last=null;
  current = root; // start at root
  while(current != null) // until the bottom,
  {
   last = current; // remember Node
   current = current.leftChild; // go to left child
  }
  return last;
 }

 public void insert(int id, double dd)
 {
  Node newNode = new Node(); // make new Node
  newNode.iData = id; // insert data
  newNode.dData = dd;
  if(root==null) // no Node in root
   root = newNode;
  else // root occupied
  {
   Node current = root; // start at root
   Node parent;
   while(true) // (exits internally)
   {
    parent = current;
    if(id < current.iData) // go left?
    {
     current = current.leftChild;
     if(current == null) // if end of the line,
     { // insert on left
      parent.leftChild = newNode;
      return;
     }
    } // end if go left
    else // or go right?
    {
     current = current.rightChild;
     if(current == null) // if end of the line
     { // insert on right
      parent.rightChild = newNode;
      return;
     }
    } // end else go right
   } // end while
  } // end else not root
 } // end insert()

 public boolean delete(int key) // delete Node with given key
 { // (assumes non-empty list)
  Node current = root;
  Node parent = root;
  boolean isLeftChild = true;
  while(current.iData != key) // search for Node
  {
   parent = current;
   if(key < current.iData) // go left?
   {
    isLeftChild = true;
    current = current.leftChild;
   }
   else // or go right?
   {
    isLeftChild = false;
    current = current.rightChild;
   }
   if(current == null) // end of the line,
    return false; // didn't find it
  } // end while
  // found Node to delete
  // continues...
 
  // delete() continued...
  // if no children, simply delete it
  if(current.leftChild==null && current.rightChild==null)
  {
   if(current == root) // if root,
    root = null; // tree is empty
   else if(isLeftChild)
    parent.leftChild = null; // disconnect
   else // from parent
    parent.rightChild = null;
  }
  // continues...

  // delete() continued...
  // if no right child, replace with left subtree
  else if(current.rightChild==null)
   if(current == root)
    root = current.leftChild;
   else if(isLeftChild) // left child of parent
    parent.leftChild = current.leftChild;
   else // right child of parent
    parent.rightChild = current.leftChild;
  // if no left child, replace with right subtree
  else if(current.leftChild==null)
   if(current == root)
    root = current.rightChild;
   else if(isLeftChild) // left child of parent
    parent.leftChild = current.rightChild;
   else // right child of parent
    parent.rightChild = current.rightChild;
  // continued...

  // delete() continued
  else // two children, so replace with inorder successor
  {
   // get successor of Node to delete (current)
   Node successor = getSuccessor(current);
   // connect parent of current to successor instead
   if(current == root)
    root = successor;
   else if(isLeftChild)
    parent.leftChild = successor;
   else
    parent.rightChild = successor;
    // connect successor to current's left child
   successor.leftChild = current.leftChild;
  } // end else two children
  // (successor cannot have a left child)
  return true;
 } // end delete()
 
 public void printTree(){
  System.out.print("前序遍历:");
  preOrder(root);
  System.out.println();
  System.out.print("中序遍历:");
  inOrder(root);
  System.out.println();
  System.out.print("后序遍历:");
  postOrder(root);
  System.out.println();
 }
  
 // returns Node with next-highest value after delNode
 // goes to right child, then right child's left descendants
 private Node getSuccessor(Node delNode)
 {
  Node successorParent = delNode;
  Node successor = delNode;
  Node current = delNode.rightChild; // go to right child
  while(current != null) // until no more
  { // left children,
   successorParent = successor;
   successor = current;
   current = current.leftChild; // go to left child
  }
  // if successor not
  if(successor != delNode.rightChild) // right child,
  { // make connections
   successorParent.leftChild = successor.rightChild;
   successor.rightChild = delNode.rightChild;//?
  }
  return successor;
 }

 private void preOrder(Node localRoot)
 {
  if(localRoot !=null)
  {
   localRoot.displayNode();
   preOrder(localRoot.leftChild);
   preOrder(localRoot.rightChild);
  }
 }

 private void inOrder(Node localRoot)
 {
  if(localRoot != null)
  {
   inOrder(localRoot.leftChild);
   localRoot.displayNode();
   inOrder(localRoot.rightChild);
  }
 }

 private void postOrder(Node localRoot)
 {
  if(localRoot !=null)
  {
   postOrder(localRoot.leftChild);
   postOrder(localRoot.rightChild);
   localRoot.displayNode();
  }
 }
} // end class Tree

 

public class TreeApp
{
 public static void main(String[] args)
 {
  Tree theTree = new Tree(); // make a tree
  theTree.insert(50, 1.5); // insert 3 Nodes
  theTree.insert(25, 1.7);
  theTree.insert(75, 1.9);
  Node found = theTree.find(25); // find Node with key 25
  if(found != null)
   System.out.println("Found the Node with key 25");
  else
   System.out.println("Could not find node with key 25");
  //theTree.minimum().displayNode();
  theTree.printTree();
  System.out.println("删除后...");
  theTree.delete(25);
  theTree.printTree();
 } // end main()
} // end class TreeApp

分享到:
评论

相关推荐

    java二叉树算法(转)

    这篇博客"java二叉树算法(转)"可能会探讨如何在Java中实现和操作二叉树,特别是涉及算法的部分。二叉树通常用于搜索、排序和组织数据,其特性是每个节点最多有两个子节点,通常分为左子节点和右子节点。 二叉树的...

    java算法二叉树

    以下是一些关于Java中二叉树算法的知识点: 1. **递归实现**: - 在给定的代码中,我们可以看到斐波那契数列(Fibonacci sequence)的递归实现。递归是一种强大的编程技术,尤其适用于处理树状结构。在这个例子中...

    Java二叉树算法实例.zip_java 二叉树_二叉树

    这个名为"Java二叉树算法实例.zip"的压缩包显然是一个针对初学者的教程,旨在帮助他们理解并掌握二叉树的基本概念和常见算法。 首先,二叉树是由节点构成的数据结构,每个节点包含两个子节点,分别称为左子节点和右...

    用Java实现的二叉树算法.doc

    用Java实现的二叉树算法.doc

    用java实现的二叉树结构

    包括 add delete find 等方法,适用于搞java/android开发的同学学习和了解二叉树的结构以及实现。

    二叉树的java算法

    在Java中实现二叉树算法,我们通常会用到面向对象编程的思想,通过定义一个类来表示树节点,并包含相关的操作方法。在这个主题中,我们将深入探讨二叉树的遍历算法,包括前序遍历、中序遍历和后序遍历。 首先,我们...

    用Java编写的二叉树代码

    在计算机科学领域,二叉树是一...通过分析和实践这些Java二叉树代码,你可以深入理解二叉树的基本原理和操作,提高你的编程技能和解决问题的能力。同时,这对于准备面试或参加编程竞赛的开发者来说也是必不可少的练习。

    java 二叉树 算法

    java 二叉树 算法。。。。。。。。。。。。。。。

    java 常见排序算法的实现 包括二叉树

    本文将详细介绍几种常见的排序算法及其Java实现,同时也会涉及二叉树的基本概念和实现。 首先,让我们从最简单的排序算法开始。冒泡排序是一种基础的交换排序方法,它通过重复遍历待排序的数组,依次比较相邻元素并...

    java实现二叉树最佳方法

    二叉树是计算机科学中的一个重要数据结构,在进行...递归构建和遍历是实现二叉树的两个核心方面,它们共同构建了复杂二叉树算法的基石。在实际应用中,还需要考虑树结构的动态调整、内存管理以及效率优化等多个方面。

    java实现二叉树遍历算法(源代码)

    ### Java实现二叉树遍历算法详解 #### 一、引言 在计算机科学中,二叉树是一种常用的数据结构,广泛应用于各种算法和数据处理场景。为了更好地理解和操作二叉树,掌握其遍历算法至关重要。本文将详细介绍如何使用...

    Java实现二叉树的层次遍历

    在Java编程中,二叉树是一种常见的数据结构,它由节点组成,每个节点都有一个值,并且可以有至多两个子节点,分别称为左子节点和右子节点。本篇文章将详细探讨如何实现二叉树的层次遍历,即按照从根节点到叶子节点的...

    Java实现二叉树的基本操作

    在计算机科学中,二叉树是一种特殊的图结构,每个...在Java中,二叉树的实现可以帮助我们解决许多算法问题,例如搜索、排序、路径查找等。通过熟练掌握这些操作,开发者可以更好地理解和处理与二叉树相关的复杂问题。

    java简单实现二叉树

    二叉树在计算机科学中有着广泛的应用,如搜索算法、排序算法等。 #### 二、Java中实现二叉树的关键类 根据提供的代码片段,我们可以看到两个主要的类:`BTree` 和 `BNode`。这两个类是构建和操作二叉树的基础。 #...

    Java二叉树算法实现:节点插入与遍历示例代码

    ### Java二叉树算法实现:节点插入与遍历示例代码 #### 一、核心概念与定义 在深入了解本文档中的代码之前,我们先来回顾一下二叉树的基本概念: - **二叉树**是一种非线性的数据结构,每个节点最多有两个子节点...

    java算法二叉树遍历源码文档.doc

    本文档主要探讨了如何用Java实现二叉树及其遍历方法的源码。 首先,我们创建了一个名为`Tree`的类,表示二叉树中的一个节点。每个节点包含三个属性:`data`存储节点的值,`left`引用左子节点,`right`引用右子节点...

    二维矩形装箱算法--二叉树--java实现

    在Java实现中,`BaseBoxChoose.java`可能包含了装箱算法的基本策略或基类,定义了装箱选择的接口和通用方法。`Slaves.java`可能是处理并行计算的部分,利用多线程并行处理多个箱子的装车问题,提高算法执行效率。`...

    二叉树算法

    掌握二叉树算法对于学习面向对象编程、迭代、排序和搜索算法(如冒泡排序、选择排序、快速排序等)至关重要,同时也对理解C++、Java等编程语言、数据库操作、底层知识、网络编程、多线程和多进程等高级主题有深远...

    java二叉树的前序+中序+后序遍历

    java实现 二叉树的遍历 前序遍历用到递归, 中序和后序遍历用到栈, 其实还是有一定难度的

Global site tag (gtag.js) - Google Analytics