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中二叉树算法的知识点: 1. **递归实现**: - 在给定的代码中,我们可以看到斐波那契数列(Fibonacci sequence)的递归实现。递归是一种强大的编程技术,尤其适用于处理树状结构。在这个例子中...
这个名为"Java二叉树算法实例.zip"的压缩包显然是一个针对初学者的教程,旨在帮助他们理解并掌握二叉树的基本概念和常见算法。 首先,二叉树是由节点构成的数据结构,每个节点包含两个子节点,分别称为左子节点和右...
用Java实现的二叉树算法.doc
包括 add delete find 等方法,适用于搞java/android开发的同学学习和了解二叉树的结构以及实现。
在Java中实现二叉树算法,我们通常会用到面向对象编程的思想,通过定义一个类来表示树节点,并包含相关的操作方法。在这个主题中,我们将深入探讨二叉树的遍历算法,包括前序遍历、中序遍历和后序遍历。 首先,我们...
在计算机科学领域,二叉树是一...通过分析和实践这些Java二叉树代码,你可以深入理解二叉树的基本原理和操作,提高你的编程技能和解决问题的能力。同时,这对于准备面试或参加编程竞赛的开发者来说也是必不可少的练习。
java 二叉树 算法。。。。。。。。。。。。。。。
本文将详细介绍几种常见的排序算法及其Java实现,同时也会涉及二叉树的基本概念和实现。 首先,让我们从最简单的排序算法开始。冒泡排序是一种基础的交换排序方法,它通过重复遍历待排序的数组,依次比较相邻元素并...
二叉树是计算机科学中的一个重要数据结构,在进行...递归构建和遍历是实现二叉树的两个核心方面,它们共同构建了复杂二叉树算法的基石。在实际应用中,还需要考虑树结构的动态调整、内存管理以及效率优化等多个方面。
### Java实现二叉树遍历算法详解 #### 一、引言 在计算机科学中,二叉树是一种常用的数据结构,广泛应用于各种算法和数据处理场景。为了更好地理解和操作二叉树,掌握其遍历算法至关重要。本文将详细介绍如何使用...
在Java编程中,二叉树是一种常见的数据结构,它由节点组成,每个节点都有一个值,并且可以有至多两个子节点,分别称为左子节点和右子节点。本篇文章将详细探讨如何实现二叉树的层次遍历,即按照从根节点到叶子节点的...
在计算机科学中,二叉树是一种特殊的图结构,每个...在Java中,二叉树的实现可以帮助我们解决许多算法问题,例如搜索、排序、路径查找等。通过熟练掌握这些操作,开发者可以更好地理解和处理与二叉树相关的复杂问题。
二叉树在计算机科学中有着广泛的应用,如搜索算法、排序算法等。 #### 二、Java中实现二叉树的关键类 根据提供的代码片段,我们可以看到两个主要的类:`BTree` 和 `BNode`。这两个类是构建和操作二叉树的基础。 #...
### Java二叉树算法实现:节点插入与遍历示例代码 #### 一、核心概念与定义 在深入了解本文档中的代码之前,我们先来回顾一下二叉树的基本概念: - **二叉树**是一种非线性的数据结构,每个节点最多有两个子节点...
本文档主要探讨了如何用Java实现二叉树及其遍历方法的源码。 首先,我们创建了一个名为`Tree`的类,表示二叉树中的一个节点。每个节点包含三个属性:`data`存储节点的值,`left`引用左子节点,`right`引用右子节点...
在Java实现中,`BaseBoxChoose.java`可能包含了装箱算法的基本策略或基类,定义了装箱选择的接口和通用方法。`Slaves.java`可能是处理并行计算的部分,利用多线程并行处理多个箱子的装车问题,提高算法执行效率。`...
掌握二叉树算法对于学习面向对象编程、迭代、排序和搜索算法(如冒泡排序、选择排序、快速排序等)至关重要,同时也对理解C++、Java等编程语言、数据库操作、底层知识、网络编程、多线程和多进程等高级主题有深远...
java实现 二叉树的遍历 前序遍历用到递归, 中序和后序遍历用到栈, 其实还是有一定难度的