数据结构笔记_26 顺序存储二叉树

一、顺序二叉树的概念

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

在这里插入图片描述

二、特点:

n:表示二叉树中的第几个元素。(和数组下标原则保持一致,从0开始,见上图)

  • 顺序二叉树通常只考虑完全二叉树
  • 第 n 个元素的左子节点为 2 * n + 1

   例如:下标为1的元素:2的左子节点为2 * 1 + 1 = 3,3即为其左子节点下标。

  • 第 n 个元素的右子节点为 2 * n + 2
  • 第 n 个元素的父节点为 (n - 1) / 2

下面看一个需求:

现有一个数组{1,2,3,4,5,6,7},要求以二叉树前序遍历的方式进行遍历,前序遍历的结果应当为:1,2,4,5,3,6,7

三、代码

以前序遍历为例,后两种类似的。

package com.huey.tree;

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();// 1,2,4,5,3,6,7
	}

}

//编写一个ArrBinaryTree,实现顺序存储二叉树遍历

class ArrBinaryTree {
    
    
	private int[] arr;// 存储数据结点的数组

	public ArrBinaryTree(int[] arr) {
    
    // 构造器,接收传过来的数组
		super();
		this.arr = arr;
	}

	// 重载preOrder
	public void preOrder() {
    
    
		this.preOrder(0);
	}

	// 编写一个方法,完成顺序存储二叉树的一个前序遍历
	/**
	 * @param index 数组下标,分析时候的n
	 */
	public void preOrder(int index) {
    
    
		// 如果数组为空,或者arr.length = 0(虽然有个数组,但是里面一个数据都没有,就不需要遍历了)
		if (arr == null || arr.length == 0) {
    
    
			System.out.println("数组为空,不能按照二叉树的前序遍历~");
			return;
		}
		// 输出当前这个结点
		System.out.println(arr[index]);
		// 向左递归遍历
		if ((index * 2 + 1) < arr.length) {
    
    // 下标最大就是arr.length - 1,要保证不能越界。
			preOrder(2 * index + 1);// 进行左子节点的递归输出。
		}
		// 向右递归遍历
		if ((index * 2 + 2) < arr.length) {
    
    
			preOrder(2 * index + 2);
		}
	}
}

输出结果:
在这里插入图片描述
若将下标为1的元素作为根节点,
在这里插入图片描述
会输出:
在这里插入图片描述
值得注意的是,此处的方法重载是为了让主函数内的测试语句显得更加简洁。另外,这一节的知识,会在后面的堆排序当中运用到。

猜你喜欢

转载自blog.csdn.net/qq_45909299/article/details/114212150