树的基本实现

来源:互联网 发布:北京金山软件 编辑:程序博客网 时间:2024/05/21 11:04
package tree;public class Node {public int iData;//关键字public int dData;//数据public Node leftNode;//左孩子public Node rightNode;//右孩子public void displayNode(){System.out.println("{ "+iData+", "+dData+"}");}}

package tree;public class Tree {private Node root;//根节点/**本树是根据关键字来插入的,左孩子的关键字比右孩子的关键字小 * 且关键字不会重复*/public Tree(){root=null;}public Node getRoot() {return root;}public void setRoot(Node root) {this.root = root;}/**根据关键字查找节点, * @param key 关键字*/public Node findKey(int key){Node current=root;if((current==null)&&(current.rightNode==null)){//判断树是否为空System.out.println("树为空!");return null;}while(current.iData!=key){if(current.iData<key){//往左走current=current.leftNode;}else{//往右走current=current.rightNode;}if(current==null){System.out.println("没有该节点! ");return null;} }return current;}/**插入节点 * @param id 关键字 * @param dd 数据项*/public void insertNode(int id,int dd){//判断该关键字是否存在/*Node n=findKey(id);if(n!=null){return ;//说明关键字已经存在}*/Node node=new Node();node.iData=id;node.dData=dd;if(root==null){root=node;//如果树为空,则该节点就是该树的根节点return ;}Node parent;Node current=root;while(true){//找到插入的位置parent=current;if(id<current.iData){current=current.leftNode;//往左走if(current==null){parent.leftNode=node;return ;}}else{current=current.rightNode;//往右走if(current==null){parent.rightNode=node;return ;}}}}/** * 寻找后继节点*/public Node getHouJi(Node deletNode){Node HouJiParent=deletNode;Node HouJi=deletNode;Node current=HouJi.rightNode;while(current!=null){HouJiParent=HouJi;HouJi=current;current=current.leftNode;}if(HouJi!=deletNode.rightNode){HouJiParent.leftNode=HouJi.rightNode;HouJi.rightNode=deletNode.rightNode;}return HouJi;}/** * 删除一个节点 * @param key 元素的关键字*/public void deleteNode(int key){Node parent=root;//删除节点的父节点Node current=root;//删除的节点boolean isLefteChild=false;//标记该删除的 元素时parent的左孩子还是右孩子while(current.iData!=key){parent=current;if(key<current.iData){//往左走current=current.leftNode;isLefteChild=true;}else{//往右走current=current.rightNode ;isLefteChild=false;}if(current==null){System.out.println("删除失败,没有改节点");return;}}//while//如果该节点没有孩子,if((current.leftNode==null)&&(current.rightNode==null)){if(current==root){root=null;}if(isLefteChild){parent.leftNode=null;return;}else{parent.rightNode=null;return;}}//如果有一个孩子,且为左孩子 if((current.rightNode==null)&&(current.leftNode!=null)){if(current==root){root=root.leftNode;}else{if(isLefteChild){parent.leftNode=current.leftNode;return ;}else{parent.rightNode=current.leftNode;return ;}}}//如果有一个孩子,且为右孩子 if((current.rightNode!=null)&&(current.leftNode==null)){if(current==root){root=root.rightNode;}else{if(isLefteChild){parent.leftNode=current.rightNode;return ;}else{parent.rightNode=current.rightNode;return ;}}}//如果删除的节点有两个孩子,if((current.rightNode!=null)&&(current.leftNode!=null)){//找到其后继节点Node houJi=getHouJi(current);if(current==root){root=houJi;}else if(isLefteChild){parent.leftNode=houJi;}else if(!isLefteChild){parent.rightNode=houJi;}houJi.leftNode=current.leftNode;}}/** * 中序遍历树*/public void center(Node root){if(root!=null){center(root.leftNode);System.out.print(root.iData+" ");center(root.rightNode);}}public static void main(String args[]){Tree tree=new Tree();tree.insertNode(5,3);tree.insertNode(48,3);tree.insertNode(42,3);tree.insertNode(32,3);tree.insertNode(96,3);tree.insertNode(79,3);tree.insertNode(3,3);tree.insertNode(78,3);tree.insertNode(75,3);tree.insertNode(25,3);tree.insertNode(1,3);tree.insertNode(4,3);  tree.center(tree.getRoot());tree.deleteNode(48);System.out.println();tree.center(tree.getRoot());}}


0 0
原创粉丝点击