@[FAT-Remcal|Coding诗酒醉年华]
SuperJava|数据结构之二叉树实现原理
摘要
1 “树形数据结构原理”是大公司面试必问(结合hashmap)的知识,用来检验编程基础的扎实程度;
2 二叉树(Binary Tree)是树类应用最广泛的一种数据结构,也是非线性数据结构,二叉树名称的来源是由于每个节点最多只能包含两个子节点,即左节点和右节点,通常子树被成为“左子树”和“右子树”;
3 三种遍历:
3.1 中序遍历:左中右;
3.2 先序遍历:中左右;
3.3 后序遍历:左右中;
4 不同二叉树数据结构不容易区分,很容易混淆(见下一节);
二叉树的分类
1 完全二叉树(Complete Binary Tree):每一个节点的子节点的数量可以是0、1、2个,除此之外它要求每层节点添加,必须是从左到右,不允许跳步添加;
2 满二叉树(Full Binary Tree):每个节点的子节点要么没有,要么就是两个,不允许存在单个子节点的情况,单个子节点的二叉树称为“非满二叉树”;
3 二叉搜索树(Ordered Binary Tree):也称二叉排序树,要求节点的左子树小于该节点本身,右子树大于该节点,每个节点都符合这样的规则,对二叉搜索树进行中序遍历就得到一个有序的序列;(中序遍历,每个子节点都是以自己为中心的,每次打印真正打印都是中间的节点,因为每次打印时都对左边是否有数据进行了递归“试水”;)
4 均衡二叉树(Balanced Binary Tree):某一个节点的左右子节点的高度(节点数量)不能大于1(<=1),一般都是在二叉搜索树的基础之上添加自动维持平衡的性质,这种树的插入、搜索、删除的综合效率比较高;
5 完美二叉树(Perfect Binary Tree):一种理想状态,每个节点都有两个子节点,每层都被完全填充,叶子节点的高度都是一样;
应用场景
1 JVM堆内存中的逻辑结构就是使用完全二叉树实现;
2 除了二叉树,也有多叉树,子节点越多,复杂度越高,但是其高度比较低,所以查找性能较高,常用在数据库索引和文件系统;
3 二叉搜索树是最常用的一种方法,通过中序遍历出来的结果是排序的;
4 如Map、Set、JVM等逻辑存储结构是完全二叉树;
5 面试使用,二叉树是加分项,因为其应用广泛;
Code
public class BinaryTreeDemo {
public static void main(String[] args) {
BinaryTree bt = new BinaryTree();
// 8、3、10、1、6、14、4、7、13
bt.add(8);
bt.add(3);
bt.add(10);
bt.add(1);
bt.add(6);
bt.add(14);
bt.add(4);
bt.add(7);
bt.add(13);
bt.print();
}
}
public class BinaryTree {
private Node root;
//添加节点
public void add(int data){
if(root==null){
root = new Node(data);
}else{
root.addNode(data);
}
}
//输出节点
public void print(){
root.printNode();
}
private class Node{
private int data;
private Node left;
private Node right;
public Node(int data){
this.data = data;
}
public void addNode(int data){
if(this.data>data){
if(this.left==null){
this.left = new Node(data);
}else{
this.left.addNode(data);
}
}else{
if(this.right==null){
this.right = new Node(data);
}else{
this.right.addNode(data);
}
}
}
//中序遍历(先序遍历,后序遍历)
public void printNode(){
if(this.left!=null){
this.left.printNode();
}
System.out.print(this.data+"->");
if(this.right!=null){
this.right.printNode();
}
}
}
}
运行结果
1->3->4->6->7->8->10->13->14->
(完)