二叉树是一种很重要的数据结构,一般的操作就是遍历和还原.
有着很多重要的应用,比如红黑树,二叉排序树(也叫二叉搜索树)查找性能很高, jdk8 hashmap是 基于红黑树实现的,如果对二叉树不了解,那么对二叉树的变形(搜索树,平衡树,堆排序)无从入手.
二叉树定义:(递归定义,这也意味着很多操作时递归进行的)
二叉树或为空树,或是由一个节根节点加上两棵分别称为左子树和右子树的,互不相交的二叉树组成
特点:
- 每个节点最多只有两棵子树,即节点度不大于2
- 子树有左右之分,不能颠倒
二叉树节点定义:BTreeNode.java
package top.forethought.trees;
import lombok.Data;
import java.util.Queue;
/**
* @author wangwei
* @date 2019/2/7 14:23
* @classDescription 二叉树节点
*
*/
@Data
public class BTreeNode <T> {
private T data;
private BTreeNode lChild;
private BTreeNode rChild;
public BTreeNode(T data) {
this.data = data;
lChild=null;
rChild=null;
}
二叉树的生成代码:
/**
* @author wangwei
* @date 2019/2/7 14:42
* @methodDescription 生成二叉树
* A
* /\
* B C
* / /\
* D E F
*/
public BTreeNode buildBinTree(){
BTreeNode node=new BTreeNode('A');
BTreeNode nodeB=new BTreeNode('B');
BTreeNode nodeC=new BTreeNode('C');
BTreeNode nodeD=new BTreeNode('D');
BTreeNode nodeE=new BTreeNode('E');
BTreeNode nodeF=new BTreeNode('F');
nodeB.setLChild(nodeD);
node.setLChild(nodeB);
node.setRChild(nodeC);
nodeC.setLChild(nodeE);
nodeC.setRChild(nodeF);
return node;
}
二叉树的层序遍历
层序遍历:就是对二叉树的每层从左到右依次输出
需要借助队列实现:
思路:将根节点入队
递归:
出队,打印出队节点的值,然候将出队节点的孩子节点入队
直到队列为空,层序遍历结束
代码实现:
/**
* 二叉树的层序遍历:利用队列先进先出的特点实现
* @param queue
*/
public static void visitBinTreeByHierarchy(Queue<BTreeNode> queue){
if(queue.isEmpty()){
return;
}
BTreeNode head= queue.remove();
System.out.println(" 节点 data:"+head.getData());
if(head.getLChild()!=null){
queue.add(head.getLChild());
}
if(head.getRChild()!=null){
queue.add(head.getRChild());
}
visitBinTreeByHierarchy(queue);
}
测试代码:
/**
* @author wangwei
* @date 2019/2/7 14:37
* @methodDescription 测试层序遍历:
* 每层将节点入队,出队时,孩子入队
*
*/
@Test
public void testVisitByHierarchy(){
BTreeNode tree=buildBinTree(