数据结构之二叉树的使用技巧(一)
2013-10-20 17:49
267 查看
经常看到有些人写关于二叉树的一些博客,说了很多概念,然后建立二叉树那块的方法真是让我拙计啊,看到好多人是这样建立的,代码大概是这样:
第二种方法:上边那种太蛋疼了,写下个人建立的方法,这种写法使用了Java中的方法调用链,可以很准确的控制每个节点的左右子树,而且很直观,缺点就是如果数据量大了还是不方便
这种方法还有建立二叉排序树的方法,用这种方法建立的二叉树在中序遍历时,打印出来的是经过排序的数字:
上边的代码中的遍历二叉树的方法可以再写简单一点,可以更简略的类似函数式编程的思想写为如下:
最后归纳一下,其实熟练掌握数据结构还是在编程中很重要的,而且可以java语言特有的语言特性,在二叉树中可以玩出很多新的花样,比如:
1.如何按照层次来遍历一个二叉树?
2.如何按照层次来构建一个二叉树?
public class BinaryTree { int data; BinaryTree left; BinaryTree right; public BinaryTree(int d,BinaryTree l,BinaryTree r){ data=d; left=l; right=r; } //其它遍历方法之类的。。。不再重复 public static void main(String[] args) { //每次建立一个节点,然后其它的节点与以前的节点进行关联 BinaryTree bt1=new BinaryTree(1,null,null); BinaryTree bt2=new BinaryTree(2,bt1,null); BinaryTree bt5=new BinaryTree(5,null,null); BinaryTree bt4=new BinaryTree(4,null,bt5); BinaryTree root=new BinaryTree(3,bt2,bt4); } }
第二种方法:上边那种太蛋疼了,写下个人建立的方法,这种写法使用了Java中的方法调用链,可以很准确的控制每个节点的左右子树,而且很直观,缺点就是如果数据量大了还是不方便
public static class BTNode { public BTNode left, right; public int data; public BTNode(int d){ data=d; left=null; right=null; } public BTNode getLeft() { return left; } public BTNode setLeft(BTNode left) { this.left = left; return this; } public BTNode getRight() { return right; } public BTNode setRight(BTNode right) { this.right = right; return this; } public int getData() { return data; } public BTNode setData(int data) { this.data = data; return this; } public void printNode() { System.out.print(data+"\t"); } public static void main(String[] args) { //构建一个二叉树 BTNode root=new BTNode(10); root.setLeft(new BTNode(5) .setLeft(new BTNode(7)) .setRight(new BTNode(8))) .setRight(new BTNode(10) .setLeft(new BTNode(1) .setRight(new BTNode(3))) .setRight(new BTNode(2))); } }
这种方法还有建立二叉排序树的方法,用这种方法建立的二叉树在中序遍历时,打印出来的是经过排序的数字:
public class BinarySortTree { // 二叉树的跟节点 private BTNode root = null; /** 添加节点 */ public BinarySortTree addNode(int n) { if (root == null) { root=new BTNode(n); } addNode(root,n); return this; } private void addNode(BTNode node,int n){ if(n<node.getData()){ if(node.getLeft()==null) node.setLeft(new BTNode(n)); else addNode(node.getLeft(),n); }else{ if(node.getRight()==null) node.setRight(new BTNode(n)); else addNode(node.getRight(),n); } } /** * 得到二叉树的跟节点引用 */ public BTNode getRoot() { return root; } /** * 中序遍历 */ public void inOrderVisit(){ visit1(root); } /**中序遍历*/ private void visit1(BTNode root){ if(null!=root){ visit1(root.getLeft()); root.printNode(); visit1(root.getRight()); } } public static void main(String[] args) { BinarySortTree b=new BinarySortTree(); b.addNode(7).addNode(4).addNode(18).addNode(2) .addNode(3).addNode(5); b.inOrderVisit(); } /** * 二叉树的节点,抽象层次不同,包含左右子节点和跟的值 */ public static class BTNode { public BTNode left, right; public int data; public BTNode(int d){ data=d; left=null; right=null; } public BTNode getLeft() { return left; } public BTNode setLeft(BTNode left) { this.left = left; return this; } public BTNode getRight() { return right; } public BTNode setRight(BTNode right) { this.right = right; return this; } public int getData() { return data; } public BTNode setData(int data) { this.data = data; return this; } public void printNode() { System.out.print(data+"\t"); } } }
上边的代码中的遍历二叉树的方法可以再写简单一点,可以更简略的类似函数式编程的思想写为如下:
public void inOrderVisit1(){ new Object(){ void visit(BTNode root){ if(null!=root){ visit(root.getLeft()); root.printNode(); visit(root.getRight()); } } }.visit(getRoot()); }
最后归纳一下,其实熟练掌握数据结构还是在编程中很重要的,而且可以java语言特有的语言特性,在二叉树中可以玩出很多新的花样,比如:
1.如何按照层次来遍历一个二叉树?
2.如何按照层次来构建一个二叉树?
相关文章推荐
- iOS:二叉树多级表格的使用,使用三方库TreeTableView-master实现对json解析数据的递归遍历整理成树状结构
- 使用js进行二叉树结构数据与数组结构数据的互相转化
- 数据结构——使用非递归方法后序遍历二叉树
- Python 数据结构使用技巧
- 从根开始按层次(第0层->第1层->第2层)遍历一颗二叉树,需要使用什么辅助数据结构?
- 数据结构之二叉树 使用数组实现
- opencv Mat 数据结构与使用技巧
- Java核心数据结构(List,Map,Set)使用技巧与优化
- 数据结构——二叉树的插入构造和删除操作
- 数据结构之树(四)——二叉树的操作(理论篇)
- 一个关于指针+记录数据类型的使用技巧
- 数据结构上机测试4.1:二叉树的遍历与应用1
- 数据结构------树,森林及二叉树的转换方法
- 数据结构——后序线索化二叉树
- 数据结构之---二叉树C实现
- ElasticSearch 使用不同表结构存储时间序列数据的查询效率分析
- 数据结构之二叉树中序非递归遍历
- SDUT-2804 数据结构实验之二叉树八:(中序后序)求二叉树的深度
- 数据结构之二叉树的递归建立和遍历(续)