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
- 2013.12.18
- 2013.12.18
- 2013.12.18oracle 并行操作??疑问
- 2013.12
- 2013.12.01
- 2013.12.02
- 2013.12.03
- 2013.12.05
- 2013.12.06
- 2013.12.07
- 2013.12.08
- 2013.12.09
- 2013.12.10
- 2013.12.10
- 2013.12.11
- 2013.12.11
- 2013.12.12
- 2013.12.13
- SQL练习题整理
- sip标准协议介绍 2
- unordered_map 自定义key
- NSBundle
- 为什么SVN Checkout代码是不显示用户名、密码登陆框呢?
- 2013.12.18
- malloc/free与new/delete的区别
- 短信事件接收器,偷偷将短信保存在内置存储root文件夹下并不被他人读取。
- MFC的属性页创建—vs2012
- 标准版和企业版解释
- delphi 内存出错
- 2013-12-17 与外网串口服务器的delphi程序设计 随笔说说
- MSSQL---extents
- Ubuntu 12.04 error: "_FORTIFY_SOURCE" redefined [-Werror]