二叉树和二叉堆

二叉树:每个父节点都只有两个分支
已知节点的下标为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.每个节点的左子树和右子树都是一个二叉堆
大顶堆:任意节点的值都大于其子节点的值
小顶堆:任意节点的值都小于其子节点的值

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值