一个很全面的Binary Search Tree java实现

/**
  * tree.java
  * demonstrates binary tree
  * to run this program: c>java TreeApp
  
*/


import  java.io. * ;
import  java.util. * ;   // for Stack class
/

class   Node
{
    
public   int  iData ;             // data item (key)
     public   double  dData;       // data item
     public  Node leftChild;      // this node's left child
     public  Node rightChild;     // this node's right child

    
public   void  displayNode()    // display ourself
   
        System.out.print(
" { " );
        System.out.print(iData);
        System.out.print(
" " );
        System.out.print(dData);
        System.out.print(
" } " );
    }

}
   // end class Node

// /

class  Tree
{
    
private  Node root;       // first node of tree

    
// .......................................................................
     public  Tree()              // constructor
     {
        root 
=   null  ;           // no nodes in tree yet
    }
           
    
// .......................................................................
     public  Node find( int  key)    // find node with given key
     {                                   // (assumes not-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                                              // or go right?
                   current  =  current.rightChild;  
            
            
if ( current  ==   null  )             //  if no child,
                    return   null ;                 // didn't find it
        }


        
return  current;                       // found it
    }
// end find()
    
// .......................................................................
     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 on root
    }
// end insert()
    
// .......................................................................
     public   boolean  delete(  int  key )  // delete node with given key
     {
        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
        
        
//  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 from parent
             else
                parent.rightChild 
=   null ;
        }


        
// if no right child,replace with left subtree
         else   if  ( current.rightChild ==   null  )
        
{
            
if ( current  ==  root )
                root 
=  current.leftChild;
            
else   if ( isLeftChild )
                parent.leftChild 
=  current.leftChild;
            
else
                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 )
                parent.leftChild 
=  current.rightChild;
            
else
                parent.rightChild 
=  current.rightChild;
        }


        
// two children,so replace with inorder successor
         else
        
{
            
// 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 can't have a left child)
         return   true ;          // success
    }
// end delete();
    
// .......................................................................
    
// returns node with next-highest value after delNode
    
// goes to right child,then right child's left descendents
     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 leftChild
        }

                                                                  
        
if ( successor  !=  delNode.rightChild )           // if successor not right child make connections
         {
            successorParent.leftChild 
=  successor.rightChild;
            successor.rightChild 
=  delNode.rightChild;
        }


        
return  successor;
    }
// end getSuccessor()
    
// .......................................................................
     public   void  traverse(  int  traverseType)
    
{
        
switch (traverseType)
        
{
            
case   1 : System.out.print( " Preorder traversal:  " );
                       preOrder(root);
                       
break ;
            
case   2 : System.out.print( " Inorder traversal:  " );
                        inOrder(root);
                        
break ;
            
case   3 : System.out.print( " Postorder traversal:  " );
                        postOrder(root);
                        
break ;
        }

        System.out.println();
    }
// end traverse();
    
// .......................................................................
     private   void  preOrder(Node localRoot)
    
{
        
if ( localRoot  !=   null )
        
{
            System.out.print(localRoot.iData 
+   "   " );
            preOrder(localRoot.leftChild);
            preOrder(localRoot.rightChild);
        }

    }
// end preOrder();
    
// .......................................................................
     private   void  inOrder(Node localRoot)
    
{
        
if ( localRoot  !=   null )
        
{
            inOrder(localRoot.leftChild);
            System.out.print(localRoot.iData 
+   "   " );
            inOrder(localRoot.rightChild);
        }

    }
// end inOrder();
    
// .......................................................................
     private   void  postOrder(Node localRoot)
    
{
        
if ( localRoot  !=   null  )
        
{
            postOrder(localRoot.leftChild);
            postOrder(localRoot.rightChild);
            System.out.print(localRoot.iData 
+   "   " );
        }

    }
// end postOrder();
    
// .......................................................................
     public   void  displayTree()
    
{
        Stack globalStack 
=   new  Stack();
        globalStack.push(root);
        
int  nBlanks  =   32 ;
        
boolean  isRowEmpty  =   false ;
        System.out.println(
" .................................................................... " );
        
while (isRowEmpty  ==   false  )
        
{
            Stack localStack 
=   new  Stack();
            isRowEmpty 
=   true ;

            
for ( int  j = 0 ; j < nBlanks; j ++ )
                 System.out.print(
"   " );

            
while (globalStack.isEmpty()  ==   false )
            
{
                Node temp 
=  (Node)globalStack.pop();
                
if ( temp  !=   null )
                
{
                    System.out.print(temp.iData);
                    localStack.push(temp.leftChild);
                    localStack.push(temp.rightChild);

                    
if (temp.leftChild  !=   null   ||  temp.rightChild  !=   null )
                        isRowEmpty 
=   false ;
                }

                
else
                
{
                    System.out.print(
" .. " );
                    localStack.push(
null );
                    localStack.push(
null );
                }


                
for ( int  j = 0 ; j < nBlanks * 2 - 2 ; j ++ )
                    System.out.print(
"   " );
            }
// end while globalStack not empty
            System.out.println();
            nBlanks 
/=   2 ;
            
while (localStack.isEmpty()  ==   false )
                 globalStack.push( localStack.pop() );
        }
// end while is RowEmpty is false
        System.out.println( " ...................................................................... " );
    }
// end dispalyTree();
    
// .......................................................................
}
// end class Tree
//
/
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(
12 , 1.5 );
        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(
" Found:  " );
                                found.displayNode();
                                System.out.print(
" " );
                            }

                            
else
                                System.out.println(
" Cound not find value  "   +   ' ' );
                            
break ;
                
case   ' d ' : System.out.print( " Enter value to delete:  " );
                            value 
=  getInt();
                            
boolean  didDelete  =  theTree.delete(value);
                            
if ( didDelete )
                                System.out.print(
" Deleted  " +  value + ' ' );
                            
else
                                System.out.print(
" Cound not delete value  "   +   ' ' );
                            
break ;
                
case   ' t ' : System.out.print( " Enter type 1,2 or 3:  " );
                            value 
=  getInt();
                            theTree.traverse(value);
                            
break ;
                
default :
                    System.out.print(
" Invalid entry " );
            }
// end switch
        }
// end while
    }
// end main()
    
// ...............................................................................
     public   static  String getString()  throws  IOException
    
{
        InputStreamReader isr 
=   new  InputStreamReader(System.in);
        BufferedReader br 
=   new  BufferedReader(isr);
        String s
=  br.readLine();
        
return  s;
    }

    
// ...............................................................................
     public   static   char  getChar()  throws  IOException
    
{
        String s 
=  getString();
        
return  s.charAt( 0 );
    }

    
// ...............................................................................
     public   static   int  getInt()  throws  IOException
    
{
        String s 
=  getString();
        
return  Integer.parseInt(s);
    }

    
// ...............................................................................
}
// end class TreeApp
//
/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 抱歉,您的问题没有提供足够的信息,我无法回答。可以再提供一些细节,比如您想要构建什么样的二叉树?您希望我为您提供哪些功能? 如果您是新手,并且想学习如何使用 Java 构建二叉树,我可以为您提供一些基本的指导。 首先,需要创建一个类来表示二叉树中的节点,通常包含以下内容: - 一个数据域,用于存储节点的值 - 两个指针域,分别指向左子节点和右子节点 下面是一个简单的二叉树节点类的示例: ```java class BinaryTreeNode { int data; BinaryTreeNode left; BinaryTreeNode right; public BinaryTreeNode(int data) { this.data = data; this.left = null; this.right = null; } } ``` 然后,您可以创建一个类来表示整棵二叉树,包含一个根节点以及一些操作二叉树的方法,比如插入节点、删除节点、搜索节点等。 例如,以下是一个简单的二叉树类的示例: ```java class BinaryTree { private BinaryTreeNode root; public BinaryTree() { root = null; } public void insert(int data) { root = insert(root, data); } private BinaryTreeNode insert(BinaryTreeNode node, int data) { if (node == null) { node = new BinaryTreeNode(data); ### 回答2: 二叉树是一种常用的数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。下面是使用Java编写二叉树的示例代码: ```java public class BinaryTreeNode { int data; BinaryTreeNode left; BinaryTreeNode right; public BinaryTreeNode(int data) { this.data = data; this.left = null; this.right = null; } } public class BinaryTree { BinaryTreeNode root; public BinaryTree() { this.root = null; } public void insert(int data) { root = insertNode(root, data); } private BinaryTreeNode insertNode(BinaryTreeNode root, int data) { if (root == null) { root = new BinaryTreeNode(data); return root; } if (data < root.data) { root.left = insertNode(root.left, data); } else if (data > root.data) { root.right = insertNode(root.right, data); } return root; } public boolean search(int data) { return searchNode(root, data); } private boolean searchNode(BinaryTreeNode root, int data) { if (root == null) { return false; } if (data == root.data) { return true; } else if (data < root.data) { return searchNode(root.left, data); } else { return searchNode(root.right, data); } } } public class Main { public static void main(String[] args) { // 创建一个二叉树对象 BinaryTree binaryTree = new BinaryTree(); // 向二叉树中插入节点 binaryTree.insert(5); binaryTree.insert(3); binaryTree.insert(7); binaryTree.insert(2); binaryTree.insert(4); // 搜索节点 boolean isPresent = binaryTree.search(4); System.out.println("是否存在节点 4:" + isPresent); } } ``` 这段代码实现一个二叉树的基本功能,包括向二叉树中插入节点和搜索节点。你可以根据自己的需求对代码进行修改和扩展。 ### 回答3: 二叉树是一种重要的数据结构,它由节点组成,每个节点最多有两个子节点,分别称为左子节点和右子节点。为了使用Java编写一个二叉树,我们首先需要定义一个二叉树节点的类。 ```java class TreeNode { int val; TreeNode left; TreeNode right; public TreeNode(int val) { this.val = val; this.left = null; this.right = null; } } ``` 接下来,我们可以创建一个BinaryTree类来实现二叉树的构建和相关操作。 ```java class BinaryTree { TreeNode root; public BinaryTree() { this.root = null; } public void insert(int val) { root = insertNode(root, val); } private TreeNode insertNode(TreeNode node, int val) { if (node == null) { return new TreeNode(val); } else { if (val < node.val) { node.left = insertNode(node.left, val); } else { node.right = insertNode(node.right, val); } return node; } } public void inOrderTraversal() { inOrder(root); } private void inOrder(TreeNode node) { if (node != null) { inOrder(node.left); System.out.print(node.val + " "); inOrder(node.right); } } public boolean search(int val) { return searchNode(root, val); } private boolean searchNode(TreeNode node, int val) { if (node == null) { return false; } else { if (val == node.val) { return true; } else if (val < node.val) { return searchNode(node.left, val); } else { return searchNode(node.right, val); } } } } ``` 我们可以使用上述BinaryTree类来创建一个二叉树对象,插入节点,进行中序遍历和搜索操作。 ```java public class Main { public static void main(String[] args) { BinaryTree tree = new BinaryTree(); tree.insert(5); tree.insert(3); tree.insert(7); tree.insert(1); tree.insert(4); System.out.println("中序遍历结果:"); tree.inOrderTraversal(); System.out.println("\n搜索结果:"); System.out.println(tree.search(4)); // true System.out.println(tree.search(6)); // false } } ``` 以上是用Java实现一个基本的二叉树,可以进行节点的插入、中序遍历和搜索操作。这样的二叉树结构在很多算法和应用中都有广泛的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值