参考文档:
avl树:http://lib.csdn.net/article/datastructure/9204
avl树:http://blog.csdn.net/javazejian/article/details/53892797
trie树:https://www.cnblogs.com/huangxincheng/archive/2012/11/25/2788268.html
b,b+,b* 树 :https://www.cnblogs.com/wjoyxt/p/5501706.html
b,b+ 树 & linux磁盘存储 :https://www.cnblogs.com/vincently/p/4526560.html
b,b+树 & mysql索引 & 索引的结构优化:http://blog.codinglabs.org/articles/theory-of-mysql-index.html
树:
树(Tree)是n(n≥0)个结点的有限集T,并且当n>0时满足下列条件:
(1)有且仅有一个特定的称为根(Root)的结点;
(2)当n>1时,其余结点可以划分为m(m>0)个互不相交的有限集T1、T2 、…、Tm,每个集Ti(1≤i≤m)均为树,且称为树T的子树(SubTree)。
特别地,不含任何结点(即n=0)的树,称为空树。
如下就是一棵树的结构:
两种树:
- 有序树:若将树中每个结点的各子树看成是从左到右有次序的(即不能互换),则称该树为有序树
- 无序树:若将树中每个结点的各子树看成是从左到右无次序的(即可以互换),则称该树为无序树
多叉树的广度优先遍历与深度优先遍历
举个栗子:
多叉树
广度优先遍历:a b c d e f g h i
深度优先遍历:a b d e i c f g h (相当于二叉树的先序遍历)
实现:
public class MultiwayTree { private static MultiwayNode root; public MultiwayTree(){ // a // b c // d e f g h // i MultiwayNode h=new MultiwayNode("h"); MultiwayNode i=new MultiwayNode("i"); MultiwayNode g=new MultiwayNode("g"); MultiwayNode f=new MultiwayNode("f"); MultiwayNode d = new MultiwayNode("d"); MultiwayNode e = new MultiwayNode("e",i); MultiwayNode b = new MultiwayNode("b", d, e); MultiwayNode c = new MultiwayNode("c", f, g,h); root = new MultiwayNode("a", b, c); } //深度优先遍历 static void depthFirstSearch(MultiwayNode node){ if(node==null){ return; } List<MultiwayNode> children=node.children; if(children==null){ return; } System.out.print(node.value+" "); for(MultiwayNode no:children){ depthFirstSearch(no); } } //广度优先遍历 static void breadthFirstSearch(){ List<MultiwayNode> list=new ArrayList<MultiwayNode>(); list.add(root); breadthFirstSearch(list); } //广度优先遍历 static void breadthFirstSearch(List<MultiwayNode> nodes){ List<MultiwayNode> level=new ArrayList<MultiwayNode>(); for(MultiwayNode node:nodes){ System.out.print(node.value+" "); List<MultiwayNode> children=node.children; level.addAll(children); children.clear(); } if(level.size()>0){ breadthFirstSearch(level); } } public static void main(String[] args) { MultiwayTree head=new MultiwayTree(); depthFirstSearch(head.root); } } class MultiwayNode{ public String value; public List<MultiwayNode> children=null; public MultiwayNode(String value,MultiwayNode... nodes){ this.value=value; children=new ArrayList<MultiwayNode>(); for(MultiwayNode node:nodes){ children.add(node); } } }