java实现二叉树
2015-10-30 15:35
447 查看
之前学习c对二叉树有一定的了解,现在学习java,想利用java来实现二叉树。
首先我们必须知道的几点关于完全二叉树:
除了最后一层以外,每一层上的节点数均达到最大值,在最后一层上只缺少右边的部分节点
知道了这个概念还不行,我们必须知道如果将一个数组转变成二叉树,对于每一个节点的左右子节点的坐标分别是什么
对于一个完全二叉树,1、如果一个节点不是叶子节点,那么他的左子节点的坐标一定为2*i+1,如果他的左子节点的坐标小于数组的最大索引length-1,那么它一定有右子节点,坐标一定是2*i+2 2、对于一个完全二叉树,它的最大的非叶子节点在数组中的坐标一定是length/2-1
如果理解了上面的结论,创建一个完全二叉树就非常简单了。
下面是实现的具体代码:
那么如何遍历二叉树呢,在学习数据结构应该都知道,遍历二叉树分为先序后序中序三种遍历方式,遍历的方法都基本类似,唯一的区别就是输出数据语句的位置不同,下面是代码:
首先我们必须知道的几点关于完全二叉树:
除了最后一层以外,每一层上的节点数均达到最大值,在最后一层上只缺少右边的部分节点
知道了这个概念还不行,我们必须知道如果将一个数组转变成二叉树,对于每一个节点的左右子节点的坐标分别是什么
对于一个完全二叉树,1、如果一个节点不是叶子节点,那么他的左子节点的坐标一定为2*i+1,如果他的左子节点的坐标小于数组的最大索引length-1,那么它一定有右子节点,坐标一定是2*i+2 2、对于一个完全二叉树,它的最大的非叶子节点在数组中的坐标一定是length/2-1
如果理解了上面的结论,创建一个完全二叉树就非常简单了。
下面是实现的具体代码:
public class BinTree { private BinTree leftChild; private BinTree rightChild; private int data; public BinTree(int data){ leftChild=null; rightChild=null; this.data=data; } //创建二叉树,返回根节点 public static BinTree createTree(int[] array){ if(array==null) return null; if(array.length<=0) return null; //创建根节点,左右子树为空 BinTree root=new BinTree(array[0]); //存放每个节点信息,便于取值 List<BinTree> list=new ArrayList<BinTree>(); list.add(root); for(int i=0;i<=array.length/2-1;i++){ BinTree left=new BinTree(array[2*i+1]); list.add(left); //当前节点左节点在数组中的坐标为2*i+1,右节点坐标为2*i+2 list.get(i).leftChild=left; if(2*i+1<array.length-1){ BinTree right=new BinTree(array[2*i+2]); list.add(right); list.get(i).rightChild=right; } } return root; } }上面创建了一个完全二叉树,如果知道上面提到的二叉树的特点的话,仔细阅读代码应该和好理解,其中list的作用主要是为了帮助我们记录下每一个叶子节点的信息,这样我们在向后遍历时就方便的多。
那么如何遍历二叉树呢,在学习数据结构应该都知道,遍历二叉树分为先序后序中序三种遍历方式,遍历的方法都基本类似,唯一的区别就是输出数据语句的位置不同,下面是代码:
//先序遍历 public static void preOrderBinTree(BinTree root){ if(root==null) return; System.out.println(root.data); preOrderBinTree(root.leftChild); preOrderBinTree(root.rightChild); } //后序遍历 public static void postOrderBinTree(BinTree root){ if(root==null) return; postOrderBinTree(root.leftChild); postOrderBinTree(root.rightChild); System.out.println(root.data); } //中序遍历 public static void inOrderBinTree(BinTree root){ if(root==null) return; preOrderBinTree(root.leftChild); System.out.println(root.data); preOrderBinTree(root.rightChild); }其实这就是用的递归算法,仔细理解应该不难,最后运行输出就可以了
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序
- 二叉查找树
- [原创]java局域网聊天系统