java中二叉树的创建以及几个常用的函数
来源:互联网 发布:中国掠夺非洲资源知乎 编辑:程序博客网 时间:2024/05/02 23:51
二叉树是我们在编程过程中常用的数据模型,但是java本身并没有提供简单的二叉树类以供调用,今天我们就自己写了一个BinaryTreeFactory类,用来创建一棵二叉树,并且提供先序遍历,中序遍历,后序遍历,层次遍历这几种不同的遍历方式。
废话不多说,上代码
首先是二叉树的节点类,你可以将它写成内部类的形式
/** * * @author yyd *二叉树的节点类 */public class BTNode {private BTNode left; private BTNode right; private int data; public BTNode(int data){ this.left = null; this.right = null; this.data = data; }public BTNode getLeft() {return left;}public void setLeft(BTNode left) {this.left = left;}public BTNode getRight() {return right;}public void setRight(BTNode right) {this.right = right;}public int getData() {return data;}public void setData(int data) {this.data = data;} }
接下来是BinaryTreeFactory类,即是一个工厂类,提供多种创建方法以及遍历方法
/** * * @author pc *工厂类 *用来产生二叉树,返回的是所生成二叉树的根节点 *并且提供先序,中序,后序,层次遍历四种遍历方式 *提供查找某节点以及该节点高度的方法 */public class BinaryTreeFactory {/** * 根据一个数组来创建二叉树 * @param a[0..n] n+1个数据组成的数组,其中a[0]=-1不参与树的创建 * a[1]~a[n]代表数的节点,a[2*i]是a[i]的左子结点,a[2*i+1]是右子节点 * 若a[t]=-1则代表该节点为空节点 */ public static BTNode buildTreeByArray(int[] a,int n){ BTNode[] p=new BTNode[n+1]; p[0]=null; for(int i=1;i<=n;i++){ if(a[i]==-1){ p[i]=null; } else{ p[i]=new BTNode(a[i]); } } for(int i=1;i<=n/2;i++){ if(a[i]!=-1){ if((2*i<=n)&&a[2*i]!=-1){ p[i].setLeft(p[2*i]); } if((2*i+1<=n)&&(a[2*i+1]!=-1)){ p[i].setRight(p[2*i+1]); } } } return p[1]; } /** * 根据一个先序遍历数组和一个中序遍历数组建立一棵二叉树 * 数组从1开始,pre[0]=-1与in[0]=-1不参与树的构建 */ public static BTNode buildByPreInOrder(int[] pre,int[] in,int prelow,int prehigh,int inlow,int inhigh){ if((prehigh-prelow>=0)&&(inhigh-inlow>=0)){ BTNode n=new BTNode(pre[prelow]); int k=inlow; for(int i=inlow;i<=inhigh;i++){ if(pre[prelow]==in[i]){ k=i; break; } } n.setLeft(buildByPreInOrder(pre,in,prelow+1,prelow+k-1,inlow,k-1)); n.setRight(buildByPreInOrder(pre, in, prelow+k, prehigh, k+1, inhigh)); return n; } else return null; } /** * 根据一个中序遍历数组和一个后序遍历数组建立一棵二叉树 * 数组从1开始,post[0]=-1与in[0]=-1不参与树的构建 */ public static BTNode buildByInPostOrder(int[] in,int[] post,int inlow,int inhigh,int postlow,int posthigh){ if((posthigh-postlow>=0)&&(inhigh-inlow>=0)){ BTNode n=new BTNode(post[posthigh]); int k=inlow; for(int i=inlow;i<=inhigh;i++){ if(post[posthigh]==in[i]){ k=i; break; } } int leftLen=k-inlow; int rightLen=inhigh-k; n.setLeft(buildByInPostOrder(in,post,inlow,inlow+leftLen-1,postlow,postlow+leftLen-1)); n.setRight(buildByInPostOrder(in,post, k+1, inhigh, postlow+leftLen, posthigh-1)); return n; } else return null; } /** * 前序遍历 * @param node */ public static void preOrder(BTNode node){ if(node != null){ System.out.print(node.getData()+" "); preOrder(node.getLeft()); preOrder(node.getRight()); } } /** * 中序遍历 * @param node */ public static void inOrder(BTNode node){ if(node != null){ inOrder(node.getLeft()); System.out.print(node.getData()+" "); inOrder(node.getRight()); } } /** * 后序遍历 * @param node */ public static void postOrder(BTNode node){ if(node != null){ postOrder(node.getLeft()); postOrder(node.getRight()); System.out.print(node.getData()+" "); } } /** * 层次遍历 * @param node */ public static void levelOrder(BTNode node){ BTNode[] queue=new BTNode[255]; int tail=0; int head=0;//队头指针与队尾指针 BTNode p=node; if(p!=null){ queue[tail++]=node;//将节点加入队列中 while(head!=tail){//即队不空 BTNode temp=queue[head++]; System.out.print(temp.getData()+" "); if(temp.getLeft()!=null){ queue[tail++]=temp.getLeft(); } if(temp.getRight()!=null){ queue[tail++]=temp.getRight(); } } } } /** * 从以node为根的树中找出值为x的节点,若找到就返回该节点,否则返回null * @param x * @param node */ public static BTNode find(int x,BTNode node){ if(node!=null){ if(node.getData()==x){ return node; } else{ BTNode t=find(x,node.getLeft()); if(t!=null) return t; else return find(x,node.getRight()); } } else{ return null; } } /** * 给出一个节点判断它在树中的高度 * @param node * @return */ public static int getDepth(BTNode node){ if(node==null) return 0; else{ int lh=getDepth(node.getLeft()); int rh=getDepth(node.getRight()); return lh>=rh?lh+1:rh+1; } } }
0 0
- java中二叉树的创建以及几个常用的函数
- java中几个常用的字符串函数
- JAVA中二叉树的常用算法
- java实现二叉树的创建以及遍历
- java实现二叉树的创建以及遍历
- 图的创建 以及常用函数
- 开发中常用的几个时间函数
- Javascript中常用的几个数字函数
- php中几个常用的函数
- sql server中常用的几个函数
- Opencv中常用的几个函数
- JS中几个常用的函数
- vc++中几个常用的数学函数
- 反射中常用的几个函数
- 几个常用的函数
- 常用的几个函数
- JAVA中subString以及split函数等几个函数的用法技巧
- 二叉树的创建以及遍历
- 鼠标滚动事件
- JavaScript加密库 Crypto-JS
- JSON解析
- HDOJ The Euler function 2824【欧拉函数】
- perl 面向对象举例
- java中二叉树的创建以及几个常用的函数
- android杂记8:Color
- 在GridView里添加一个功能按钮
- C++判断文件夹是否存在
- Fedora安装fedy
- SCU_1114_数字三角
- Maximum Subarray Difference
- 中文版Photoshop CC 技法精粹:以假乱真的艺术(第8版)——互动出版网
- 鼠标移动出新文字