二叉树:每个父节点都只有两个分支
已知节点的下标为i,则其左儿子下标为2i+1,右儿子的下标为2i+2
已知节点的下标为i,则其父节点下标为(i-1)/2
遍历二叉树(三种遍历方法)
1.先序遍历,这里所说的先序指的是先遍历根,即根左右
2.中序遍历,左根右
3.后序遍历,左右根
遍历利用递归思想,因为二叉树本身就是由递归构成的
public class 遍历二叉树 {
public static void main(String[] args) {
//用数组依次从0编号,是一颗固定的树,按数组依次填入树中内容
int []a= {78,56,34,43,4,1,15,2,23};
System.out.println("先序遍历为");
PreOrder(a,0);//从0号开始遍历
System.out.println();
System.out.println("中序遍历为");
InOrder(a,0);
System.out.println();
System.out.println("后序遍历为");
HouOrder(a,0);
}
//先序遍历(根左右)
private static void PreOrder(int[] a,int i) {
// TODO Auto-generated method stub
//参数i表示,依此下标为父节点开始遍历子数
if(i<a.length)
{
System.out.print(a[i]+" ");
PreOrder(a, 2*i+1);//遍历左子树
PreOrder(a, 2*i+2);//遍历右子树
}
}
//中序遍历(左根右)
private static void InOrder(int[] a,int i) {
// TODO Auto-generated method stub
//参数i表示,依此下标为父节点开始遍历子数
if(i<a.length)
{
InOrder(a, 2*i+1);//遍历左子树
System.out.print(a[i]+" ");
InOrder(a, 2*i+2);//遍历右子树
}
}
//后序遍历(左右根)
private static void HouOrder(int[] a,int i) {
// TODO Auto-generated method stub
//参数i表示,依此下标为父节点开始遍历子数
if(i<a.length)
{
HouOrder(a, 2*i+1);//遍历左子树
HouOrder(a, 2*i+2);//遍历右子树
System.out.print(a[i]+" ");
}
}
}
效果:
完全二叉树:除了最底层的叶子节点外,其余节点都有左右两个儿子节点
近似完全二叉树:即非常接近完全二叉树,只有右侧会有空缺
例如:
完全二叉树
近似完全二叉树
二叉堆:二叉堆必须是完全二叉树或者近似完全二叉树
二叉堆的两大特征:
1.父节点的键值总是大于等于(或小于等于)任何一个子节点的键值
2.每个节点的左子树和右子树都是一个二叉堆
大顶堆:任意节点的值都大于其子节点的值
小顶堆:任意节点的值都小于其子节点的值