顺序存储二叉树

1.基本概念

从数据存储方式来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组。

1660221201463

2.顺序存在二叉树的特点

  1. 顺序存储二叉树通常只考虑完全二叉树
  2. 第n个元素的左子结点为 2*+1(对应于数组的下标值)
  3. 第n个元素的右子结点为 2 * n + 2(对应于数组的下标值)
  4. 第n个结点的父结点为 (n-1)/2
  5. n: 表示二叉树中的第几个元素(按0开始编号),如上图所示

3.代码实现

public class ArrBinaryTreeDemo {

	public static void main(String[] args) {
		int[] arr = {1,2,3,4,5,6,7};
		//创建一个ArrBinaryTree
		ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
//		arrBinaryTree.preOrder(0);//注意这里要传入参数0,使用重载的方法来避免重这里传入参数
		//arrBinaryTree.preOrder();
		arrBinaryTree.infixOrder();
		arrBinaryTree.postOrder();

	}

}

//编写ArrBinaryTree类,实现顺序存储二叉树
class ArrBinaryTree{
	// 存储数据结点的数组
	private int[] arr;

	public ArrBinaryTree(int[] arr) {
		//super();
		this.arr = arr;
	}
	
	// 重载preOrder()方法
	public void preOrder(){
		this.preOrder(0);//这里将参数为0的根结点传入,不用在函数调用的时候传入参数
	}
	
	// 重载infixOrder()方法
	public void infixOrder() {
		this.infixOrder(0);// 这里将参数为0的根结点传入,不用在函数调用的时候传入参数
	}
	
	// 重载postOrder()方法
	public void postOrder() {
		this.postOrder(0);// 这里将参数为0的根结点传入,不用在函数调用的时候传入参数
	}
	
	// 编写方法实现顺序存储二叉树的前序遍历
	/**
	 * 
	 * @param index 表示数组的小标,从0开始
	 */
	
	public void preOrder(int index){
		//如果数组为空,和数组长度为0,不能遍历
		if (arr == null && arr.length == 0) {
			System.out.println("数组为空,不能进行前序遍历");
		}
		
		// 输出当前这个元素
		System.out.println(arr[index]);
		
		//向左子树进行递归
		// 注意需要判断是否超过数组的长度
		if (arr.length > (2*index + 1)) {
			preOrder(2*index + 1);
		}
		
		//向右子树进行递归
		if (arr.length > (2*index + 2)) {
			preOrder(2*index + 2);
		}
		
	}
	
	// 编写方法实现顺序存储二叉树的中序遍历
	public void infixOrder(int index){
		//判断数组是否为空
		if (arr == null && arr.length == 0) {
			System.out.println("数组为空,不能进行遍历");
		}
		
		//向左递归子树
		if (arr.length > (2*index + 1)) {
			infixOrder(2*index +1);
		}
		//输出当前结点
		System.out.println(arr[index]);
		//向右递归子树
		if (arr.length > (2*index + 2)) {
			infixOrder(index*2 + 2);
		}
	}
	
	// 编写方法实现顺序存储二叉树的后序遍历
	public void postOrder(int index){
		//判断数组是否为空
		if (arr == null && arr.length == 0) {
			System.out.println("数组为空,不能进行遍历");
		}
		
		//向左递归子树
		if (arr.length > (2*index + 1)) {
			postOrder(2*index +1);
		}
		
		//向右递归子树
		if (arr.length > (2 * index + 2)) {
			postOrder(index * 2 + 2);
		}
		// 输出当前结点
		System.out.println(arr[index]);
	}
}

4.方法重载的使用

重载是在一个类里面,方法名字相同,而参数不同。返回类型可以相同也可以不相同

重载的规则:

  1. 被重载的方法必须改变参数列表(参数个数或类型不一样)
  2. 被重载的方法可以改变返回类型
  3. 被重载的方法可以改变访问修饰符
  4. 被重载的方法可以声明新的或更广的检查异常
  5. 方法能够在同一个类中或者在一个子类中被重载

重载的意义:

让方法使用相同的方法名,再各自使用自己的形参,最终在用户使用时,系统就可以根据用户输入的数据的类型进行方

法的匹配,避免了使用者需要记忆大量的方法名。(在上面的代码中体现)

posted @ 2022-08-11 21:14  半路_出家ren  阅读(69)  评论(0编辑  收藏  举报
返回顶端