SuperJava|数据结构之二叉树实现原理

@[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->


(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值