Java数据结构与算法———(58)顺序存储二叉树的前序、中序、后序遍历

完成顺序存储二叉树的前序、中序、后续遍历。

一、代码
public class ArrayBinaryTreeDemo {

	public static void main(String[] args) {

		int[] arr = { 1, 2, 3, 4, 5, 6, 7 };
		ArrayBinaryTree arrayBinaryTree = new ArrayBinaryTree(arr);
		System.out.println("前序遍历");
		arrayBinaryTree.preOrder();// 正确答案为:1, 2, 4, 5, 3, 6, 7
		System.out.println("中序遍历:");
		arrayBinaryTree.infixOrder(0);//正确答案:4, 2, 5, 1, 6, 3, 7
		System.out.println("后序遍历:");
		arrayBinaryTree.postOrder(0);//正确答案:4, 5, 2, 6, 7, 3, 1
	}

}

//编写一个 ArrayBinaryTree 类,实现顺序存储二叉树遍历
class ArrayBinaryTree {
	// 定义属性
	private int[] arr;// 存储数据结点的数组

	// 构造器
	public ArrayBinaryTree(int[] arr) {
		this.arr = arr;
	}

	// 为了方便调用 preOrder 方法,重载 preOrder 方法
	// 重载后,用 ArrayBinaryTree 的对象 arrayBinaryTree调用这个无参的 preOrder()
	// 方法时,就默认调用了带参(index为0)的 preOrder 方法
	public void preOrder() {
		this.preOrder(0);
	}

	// 编写一个方法,完成顺序存储二叉树的前序遍历(父左右)
	/**
	 * 
	 * @param index 开始遍历的结点在数组中的下标
	 */
	public void preOrder(int index) {
		// 1. 如果数组为空,或者arr.length == 0
		// arr == null,表示arr只是一个引用变量,没有引用任何一个数组对象
		// arr.length == 0,表示arr引用的这个数组对象的大小为0
		if (arr == null || arr.length == 0) {
			System.out.println("数组为空,不能完成二叉树的前序遍历");
		}
		
		// 2. 如果数组不为空,则先输出当前结点(父结点),即index对应的那个结点
		System.out.println(arr[index]);
		// 向左递归遍历
		// 对于数组,要考虑到是否越界的问题
		if ((2 * index + 1) < arr.length) {
			preOrder(2 * index + 1);
		}
		// 向右递归遍历
		// 对于数组,要考虑到是否越界的问题
		if ((2 * index + 2) < arr.length) {
			preOrder(2 * index + 2);
		}
	}

	// 编写一个方法,完成顺数存储二叉树的中序遍历(左父右)
	/**
	 * 
	 * @param index 开始遍历的结点在数组中的下标
	 */
	public void infixOrder(int index) {
		// 1. 如果数组为空,或者 arr.length == 0
		if (arr == null || arr.length == 0) {
			System.out.println("数组为空,不能完成中序遍历");
		}
		
		// 2. 如果数组不为空,则开始中序遍历
		// 向左递归遍历
		// 判断左结点下标(2 * index + 1)没有越界
		if ((2 * index + 1) < arr.length) {
			infixOrder(2 * index + 1);
		}
		// 输出当前结点
		System.out.println(arr[index]);
		// 向左递归遍历
		// 判断左结点下标(2 * index + 1)没有越界
		if((2 * index + 2) < arr.length) {
			infixOrder(2 * index + 2);
		}
	}
	
	//编写一个方法,完成顺序存储二叉树的后续遍历(左右父)
	public void postOrder(int index) {
		// 1. 如果数组为空,或者 arr.length == 0
		if(arr == null || arr.length == 0) {
			System.out.println("数组为空,不能完成后续遍历");
		}
		
		// 2. 如果数组不为空,则开始后续遍历
		// 向左递归遍历
		// 判断左结点下标(2 * index + 1)是否越界
		if((2 * index + 1) < arr.length) {
			postOrder(2 * index + 1);
		}
		//向右递归遍历
		//判断右结点下标(2 * index + 2)是否越界
		if((2 * index + 2) < arr.length) {
			postOrder(2 * index + 2);
		}
		//输出当前结点(当前递归层次的父结点)
		System.out.println(arr[index]);
	}
}
二、结果
前序遍历
1
2
4
5
3
6
7
中序遍历:
4
2
5
1
6
3
7
后序遍历:
4
5
2
6
7
3
1
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值