import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
class Node{
public int iData;
public double dData;
public Node leftChild;
public Node rightChild;
@Override
public String toString() {
return "{"+iData+","+dData+"}";
}
public void display(){
System.out.print("{"+iData+","+dData+"}");
}
}
class Tree{
private Node root;
public Tree(){
root=null;
}
public Node find(int key){
Node current=root;
while(current.iData!=key){
if(key<current.iData)current=current.leftChild;
else current=current.rightChild;
if(current==null)return null;
}
return current;
}
public void insert(int id,double dd){
Node newNode=new Node();
newNode.iData=id;
newNode.dData=dd;
if(root==null){
root=newNode;
}
else{
Node current=root;
Node parent;
while (true) {
parent=current;
if (id < current.iData) {
current = current.leftChild;
if (current == null) {
parent.leftChild=newNode;
return;
}
}else{
current=current.rightChild;
if(current==null){
parent.rightChild=newNode;
return;
}
}
}
}
}
public boolean delete(int key){
Node current=root;
Node parent=root;
boolean ifLeftChild=true;
while(current.iData!=key){
parent=current;
if(key<current.iData){
ifLeftChild=true;
current=current.leftChild;
}else{
ifLeftChild=false;
current=current.rightChild;
}
if(current==null)return false;
}
if(current.leftChild==null&¤t.rightChild==null){
if(current==root){
root=null;
}else if(ifLeftChild){
parent.leftChild=null;
}else{
parent.rightChild=null;
}
}else if(current.rightChild==null){
if(current==root)root=current.leftChild;
else if(ifLeftChild){
parent.leftChild=current.leftChild;
}else{
parent.rightChild=current.leftChild;
}
}else if(current.leftChild==null){
if(current==root)root=current.rightChild;
else if(ifLeftChild){
parent.leftChild=current.rightChild;
}else{
parent.rightChild=current.rightChild;
}
}else{
Node successor=getSuccessor(current);
if(current==root)root=successor;
else if(ifLeftChild){
parent.leftChild=successor;
}else{
parent.rightChild=successor;
}
successor.leftChild=current.leftChild;
}
return true;
}
private Node getSuccessor(Node delNode) {
Node successorParent=delNode;
Node successor=delNode;
Node 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 traverse(int traverseType){
switch(traverseType){
case 1:System.out.print("\nPerorder traversal:");
preOrder(root);
break;
case 2:System.out.print("\nInorder traversal:");
inOrder(root);
break;
case 3:System.out.print("\nPostorder traversal:");
PostOrder(root);
break;
}
System.out.println();
}
private void preOrder(Node localRoot) {
if(localRoot!=null){
localRoot.display();
System.out.println();
preOrder(localRoot.leftChild);
preOrder(localRoot.rightChild);
}
}
private void inOrder(Node localRoot) {
if(localRoot!=null){
preOrder(localRoot.leftChild);
localRoot.display();
System.out.println();
preOrder(localRoot.rightChild);
}
}
private void PostOrder(Node localRoot) {
if(localRoot!=null){
preOrder(localRoot.leftChild);
preOrder(localRoot.rightChild);
localRoot.display();
System.out.println();
}
}
public void displayTree(){
Stack<Node> globalStack=new Stack<Node>();
globalStack.push(root);
int nBlanks=42;
boolean ifRowEmpty=false;
System.out.println("------------------------------------------------------------------------");
while(ifRowEmpty==false){
Stack<Node> localStack=new Stack<Node>();
ifRowEmpty=true;
for(int i=0;i<nBlanks;i++)System.out.print(' ');
while(globalStack.isEmpty()==false){
Node temp=globalStack.pop();
if(temp!=null){
System.out.print(temp.iData+":"+temp.dData);
localStack.push(temp.leftChild);
localStack.push(temp.rightChild);
if(temp.leftChild!=null||temp.rightChild!=null)
ifRowEmpty=false;
}else{
System.out.print("-----");
localStack.push(null);
localStack.push(null);
}
for(int j=0;j<nBlanks*2-2;j++)System.out.print(' ');
}
System.out.println();
nBlanks/=2;
while(localStack.isEmpty()==false)
globalStack.push(localStack.pop());
}
System.out.println("------------------------------------------------------------------------");
}
}
public class TreeApp {
public static void main(String[] args) throws IOException {
int value;
Tree theTree=new Tree();
theTree.insert(50, 1.5);
theTree.insert(25, 1.2);
theTree.insert(75, 1.7);
theTree.insert(37, 1.2);
theTree.insert(43, 1.7);
theTree.insert(30, 1.5);
theTree.insert(33, 1.2);
theTree.insert(87, 1.7);
theTree.insert(93, 1.5);
theTree.insert(97, 1.5);
while(true){
System.out.print("Enter first letter of show,");
System.out.print("insert,find,delete or traverse");
int choice=getChar();
switch(choice){
case 's':
theTree.displayTree();
break;
case 'i':
System.out.print("Enter value to insert:");
value=getInt();
theTree.insert(value, value+0.9);
break;
case 'f':
System.out.print("Enter value to find:");
value=getInt();
Node found=theTree.find(value);
if(found!=null){
System.out.print("Find:");
found.display();
System.out.println();
}else{
System.out.println("could not find "+value);
}
break;
case 'd':
System.out.print("Enter value to delete:");
value=getInt();
boolean didDelete=theTree.delete(value);
if(didDelete){
System.out.println("delete vaule:"+value);
}else{
System.out.println("could not delete value:"+value);
}
break;
case 't':
System.out.print("Enter type 1,2or3");
value=getInt();
theTree.traverse(value);
break;
default:
System.out.println("Invalid Entry!");
}
}
}
private static int getChar() throws IOException {
String s=getString();
return s.charAt(0);
}
private static int getInt() throws IOException {
String s=getString();
return Integer.parseInt(s);
}
private static String getString() throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
String s=br.readLine();
return s;
}
}
分享到:
相关推荐
在Java编程中,二叉树是一种非常重要的数据结构,它被广泛应用于各种场景,如文件系统、搜索引擎、编译器语法分析等。中国电信超级号码簿菜单的实现利用了二叉树来组织和管理菜单结构,这使得数据的查找、插入和删除...
在Java中实现平衡二叉树,通常需要以下步骤: 1. **定义节点类**:首先,我们需要定义一个表示树节点的类,包含键值(key)、左子节点(left)、右子节点(right)以及可能的平衡因子(balance factor),用于判断...
总结起来,Java中创建二叉树有顺序存储、三叉链表存储和二叉链表实现三种方式,每种都有其适用场景和优缺点。选择哪种方式取决于具体需求,如空间效率、操作复杂度和内存布局等因素。理解这些方法有助于更好地利用...
在Java中,虽然没有直接提供红黑树的类,但`java.util.TreeMap`和`java.util.TreeSet`底层就是通过红黑树实现的。它们提供了高效的键值对存储和集合管理,支持有序操作,如按自然顺序或自定义比较器进行排序。 当...
二叉树横向打印算法的实现 二叉树是一种基本的数据结构,在计算机科学和编程中广泛应用。本资源介绍了一种特殊的二叉树打印算法,即横向打印二叉树结构。该算法将二叉树的根节点放在屏幕的最左边,左子树在屏幕的...
源代码可能会使用C、C++、Java或Python等编程语言,并且可能包括了数据结构(如结构体或类)来表示二叉树节点,以及相应的函数或方法来实现上述操作。通过对源代码的学习,你可以了解到如何在实际编程中创建和操作...
- 普通二叉树:没有特定限制的二叉树。 - 完全二叉树:除了最后一层外,每一层都被完全填满,并且所有的结点都尽可能地集中在左边。 - 满二叉树:所有非叶节点都有两个子节点。 - 平衡二叉树:左右两个子树的...
在实际编程中,我们可以使用C++、Java等面向对象的语言来实现线索二叉树。在`ThreadTree`这个文件中,可能包含了实现线索二叉树的类定义、节点结构以及相关的插入、删除、遍历等方法。具体实现细节需要查看源代码...
平衡二叉树的主要类型有AVL树和红黑树,它们都是为了解决普通二叉搜索树在最坏情况下性能退化成链表的问题。AVL树是最早被提出的自平衡二叉搜索树,其特点是任何节点的两个子树高度差不超过1,从而保证了查找效率在O...
本篇主要讨论基于Java的二叉树层序遍历的实现,分为三种情况: 1. **基本层序遍历(剑指offer32-Ⅰ)**: 这种遍历方法将二叉树的节点值按层顺序存储到一个一维整数数组`int[] res`中。核心思想是利用队列(这里...
"二叉排序树的删除.rar"文件可能提供了Java实现的详细步骤,包括找到待删除节点、处理无子节点、单子节点和两个子节点的情况。 二叉树的线索化是为了在不使用额外空间的情况下实现对二叉树的遍历。线索化二叉树通过...
构建线索二叉树分为两个阶段:普通二叉树到线索二叉树的转换和线索化。在转换过程中,我们需要遍历二叉树,根据当前节点在中序遍历序列中的位置,确定其前驱和后继,并更新线索信息。线索化则是为每个节点的空指针...
本资源包含了一系列的Java实现,涵盖了多种查找技术,旨在帮助开发者更好地理解和应用这些算法。下面我们将详细探讨这些查找方法及其Java实现。 1. **线性查找**: 线性查找是最基础的查找方法,适用于任何类型的...
平衡二叉树的主要类型包括AVL树和红黑树,它们都是为了克服普通二叉查找树在极端情况下可能出现的性能问题而设计的。AVL树是最早的自平衡二叉查找树,由G. M. Adelson-Velsky和E. M. Landis在1962年提出,它的主要...
6. **性能评估**:设计完成后,需要通过测试和性能评估来验证线索二叉树在不同场景下的表现,对比其他数据结构,如普通二叉树、平衡二叉树等。 7. **扩展应用**:线索二叉树可以应用于实际问题,如文件系统的目录...
哈夫曼编码(Huffman Coding)是一种数据压缩算法,它基于字符出现频率构建最优的前缀编码,以达到高效存储和传输数据的目的。...通过阅读和理解这段代码,你可以深入了解哈夫曼编码的原理和Java实现细节。
在本题中,我们需要处理的是普通二叉树,并非特殊的二叉搜索树或平衡二叉树等。 - **二叉树遍历**: 二叉树的遍历方法包括前序遍历、中序遍历和后序遍历。这些遍历方法各有特点,可用于解决不同的问题。 - **前序...
在TreeTest.java文件中,可能会实现二叉树的创建、遍历(前序、中序、后序)以及搜索、插入、删除等操作。二叉树在查找、排序等领域有着广泛的应用,比如二分查找和二叉搜索树。 最后,我们来看哈弗曼树(Huffman ...
而“带平衡条件的二叉树”是二叉树的一种特殊类型,它旨在解决普通二叉搜索树在最坏情况下性能下降的问题。在本案例中,我们关注的是AVL树,它是最早的自平衡二叉搜索树,由G. M. Adelson-Velsky和E. M. Landis于...