用java写二叉树的算法

来源:互联网 发布:软件推荐 编辑:程序博客网 时间:2024/04/29 19:48
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


原创粉丝点击