2013.12.18

来源:互联网 发布:淘宝指数在哪里 编辑:程序博客网 时间:2024/05/16 18:07

* 用数组表示树,结点的左子结点为2*index+1,右子结点为2*index+2,父结点为(index-1)/2;

* 树的任何操作都需要考虑到根结点;

写了一段让自己好有成就感的代码,哈哈

二叉搜索树,包含delete(),insert(),find(),以及前中后遍历,并且具有以树型结构输出显示的display()方法@java/DataStructrue/unit8

import java.util.*;class Node{public Data d;public Node left;public Node right;public Node(Data d){this.d=d;left=null;right=null;}public void display(){System.out.print("["+d.iData+", "+d.dData+"] ");}}class Data{public int iData;public double dData;public Data(int iData, double dData){this.iData=iData;this.dData=dData;}}class Tree{private Node root;private int displayCounter=0;public Tree(){root=null;}public void display(){NodeStack cStack=new NodeStack(100);NodeStack dStack=new NodeStack(100);Node temp;int size=1;cStack.push(root);boolean flag=true;while(true){flag=false;while(!cStack.isEmpty()){dStack.push(cStack.pop());}Node [] nArr=new Node[size];int ptr=0;while(!dStack.isEmpty()){temp=dStack.pop();nArr[ptr++]=temp;if(temp==null){cStack.push(null);cStack.push(null);}else{cStack.push(temp.left);cStack.push(temp.right);flag=true;}}if(!flag) break;//System.out.println("cStack "+cStack.depth());if(flag) output(nArr);size*=2;}} private void output(Node [] nArr){char [] cArr=new char[32];int ptr=0;for(int i=0; i<cArr.length; i++) cArr[i]=' ';int step=cArr.length/(nArr.length+1);for(int i=0; i<nArr.length; i++){if(nArr[i]==null) cArr[step*(i+1)-1]='~';else cArr[step*(i+1)-1]=(char)(nArr[i].d.iData+48);}for(int i=0; i<cArr.length; i++) System.out.print(cArr[i]);System.out.println();}public Node find(int key){Node current=root;while(key!=current.d.iData){if(key<current.d.iData) current=current.left;else current=current.right;}return current;}public void insert(int iData, double dData){Node n=new Node(new Data(iData, dData));Node current=root;Node prev=root;if(root==null){root=n; prev=root; current=root;}else{while(current!=null){if(iData<=current.d.iData){prev=current;current=current.left;}else{prev=current;current=current.right;}}if(prev.d.iData>=iData) prev.left=n;else prev.right=n;}}public Node delete(int iData){Node current, prev;current=root;prev=root;while(iData!=current.d.iData && current!=null){prev=current;if(iData<current.d.iData) current=current.left;else current=current.right;}if(current==null) return null;if(current.left==null && current.right==null){if(prev.d.iData>=iData) prev.left=null;else prev.right=null;}else if(current.left!=null && current.right!=null){Node next=current.left;Node prev1=next;if(next.right==null){if(current==root){next.right=current.right;root=next;}else{if(prev.left==current) prev.left=next;else prev.right=next;next.right=current.right;}}else{while(next.right!=null){prev1=next;next=next.right;}prev1.right=next.left;if(current==root) root=next;else{if(prev.left==current) prev.left=next;else prev.right=next;}next.right=current.right;next.left=current.left;}}else{if(current.left!=null){if(prev.left==current) prev.left=current.left;else prev.right=current.left;}else{if(prev.left==current) prev.left=current.right;else prev.right=current.right;}}return current;}//中序遍历为从小到大输出二叉搜索树元素public void inOrderTransverse(){displayCounter=0;inOrder(root);}private void inOrder(Node n){if(n==null) return;else{inOrder(n.left);n.display();if(++displayCounter%3==0) System.out.println();inOrder(n.right);}}//前序遍历public void preOrderTransverse(){displayCounter=0;preOrder(root);}public void preOrder(Node n){if(n==null) return;else{n.display();if(++displayCounter%3==0) System.out.println();preOrder(n.left);preOrder(n.right);}}//后序遍历public void postOrderTransverse(){displayCounter=0;postOrder(root);}public void postOrder(Node n){if(n==null) return;else{postOrder(n.left);postOrder(n.right);n.display();if(++displayCounter%3==0) System.out.println();}}}public class TestBinaryTree{public static void main(String [] args){Tree tree=new Tree();tree.insert(5, 1.0);tree.insert(3, 1.0);tree.insert(9, 1.0);tree.insert(4, 1.0);//tree.insert(1, 1.0);//tree.insert(2, 1.0);//tree.insert(6, 1.0);tree.insert(7, 1.0);tree.insert(8, 1.0);//tree.insert(10, 1.0);//tree.insert(0, 1.0);tree.display();}}

0 0
原创粉丝点击