二叉树:每个结点最多有两个子树的树结构。左右两个子树分别为“左子树”和“右子树”,无子树的结点称为“叶子”。
完全二叉树:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第 h 层所有的结点都连续集中在左边。
满二叉树:除了叶子结点外,其余结点均有左右孩子。特殊的完全二叉树。若满二叉树深度为k,则其节点数为2^k-1。
深度:树的最大层次。比如上图中的深度为3。
二叉排序树:又叫二叉搜索树或者二叉查找树。左根右结点从大到小。满足如下条件的二叉树:
1)若左子树不空,则左子树上所有结点的值均小于它的根节点的值;
2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值
3)左、右子树也分别为二叉排序树
4)没有键值相等的节点
平衡二叉树(AVL):它或者是一颗空树,或者它的左子树和右子树的深度之差的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。排序二叉树的进化体。
平衡因子(bf):结点的左子树的深度减去右子树的深度,那么显然-1<=bf<=1。
二叉树遍历的三种方式:
1. 先序遍历:根-->左-->右
如图a中的先序遍历结果为:ABDECFG
2. 中序遍历:左-->根-->右
如图a中的中序遍历结果为:DBEAFCG
3. 后序遍历:左-->右-->根
如图a中的后序遍历结果为:DEBFGCA
Java 实现遍历二叉树:
BinaryTree:
/**
* 二叉树
* @author huangyan
*
*/
public class BinaryTree {
int data;
BinaryTree left;
BinaryTree right;
public BinaryTree(int data) {
this.data = data;
this.left = null;
this.right = null;
}
}
递归遍历:
/**
* 先序遍历
* @param root
*/
public void preOrder(BinaryTree root){
if(root != null){
System.out.println(root.data + "-->");
preOrder(root.left);
preOrder(root.right);
}
}
/**
* 中序遍历
* @param root
*/
public void middleOrder(BinaryTree root){
if(root != null){
middleOrder(root.left);
System.out.println(root.data + "-->");
middleOrder(root.right);
}
}
/**
* 后序遍历
* @param root
*/
public void postOrder(BinaryTree root){
if(root != null){
postOrder(root.left);
postOrder(root.right);
System.out.println(root.data + "-->");
}
}