主要用数组来实现了二叉树和一些简单操作
前、中、后序遍历
添加结点
删除结点

每个结点是用孩子表示法
存储三个int类型
一个存数据data
一个存左子树在数组中的索引
一个存右子树在数组中的索引
结点类

/*** 孩子表示法实现结点* data存储int类数据* leftChild 存储左孩子在数组中的索引* RightChild存储右孩子在数组中的索引* 若没有孩子时,索引均为-1*/class BinaryNode{private int data;private int leftChild;private int rightChild;/*** 三种构造方法*/public BinaryNode(int data) {this.data = data;this.leftChild = -1;this.rightChild = -1;}public BinaryNode() {}public BinaryNode(int data, int leftChild, int rightChild) {this.data = data;this.leftChild = leftChild;this.rightChild = rightChild;}public int getData() {return data;}public void setData(int data) {this.data = data;}public int getLeftChild() {return leftChild;}public void setLeftChild(int leftChild) {this.leftChild = leftChild;}public int getRightChild() {return rightChild;}public void setRightChild(int rightChild) {this.rightChild = rightChild;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;BinaryNode that = (BinaryNode) o;return data == that.data &&leftChild == that.leftChild &&rightChild == that.rightChild;}@Overridepublic String toString() {return "BinaryNode{" +"data=" + data +", leftChild=" + leftChild +", rightChild=" + rightChild +'}';}
}

二叉树类(包含一些测试)


import java.util.Arrays;public class ArrayBinaryTree {public static void main(String[] args) {//部分测试ArrayBinaryTree a = new ArrayBinaryTree(10);a.setRootNode(0);a.addLeftNode(10,0);a.addRightNode(20,0);a.addLeftNode(30,1);a.addRightNode(40,1);a.delete(1);System.out.println(a.getNodeCount());}private int capacity;//树容量private int nodeCount;//树结点数量private BinaryNode[] elements;//存放BinaryNode类型的数组public int getCapacity() {return capacity;}public void setCapacity(int capacity) {this.capacity = capacity;}//树的结点数量public int getNodeCount() {return nodeCount;}public void setNodeCount(int nodeCount) {this.nodeCount = nodeCount;}public BinaryNode[] getElements() {return elements;}public void setElements(BinaryNode[] elements) {this.elements = elements;}@Overridepublic boolean equals(Object o) {if (this == o) return true;if (o == null || getClass() != o.getClass()) return false;ArrayBinaryTree that = (ArrayBinaryTree) o;return capacity == that.capacity &&nodeCount == that.nodeCount &&Arrays.equals(elements, that.elements);}@Overridepublic String toString() {return "ArrayBinaryTree{" +Arrays.toString(elements) +'}';}//构造方法给定数组长度capacitypublic ArrayBinaryTree(int capacity) {this.capacity = capacity;this.elements = new BinaryNode[capacity];}public ArrayBinaryTree() {}//判断是否为空树public boolean isEmpty(){return nodeCount == 0;}//设置根结点public void setRootNode(int data){if (nodeCount == 0){BinaryNode rootNode = new BinaryNode(data);this.elements[0] = rootNode;rootNode.setLeftChild(-1);rootNode.setRightChild(-1);nodeCount++;}else{throw new RuntimeException("the tree has a root!");}}//为索引为i的结点添加左孩子结点/**** @param data 新结点存储的数据* @param i 为索引为i的结点添加左孩子*          新结点在数组中的索引为2*index+1*/public void addLeftNode(int data, int index){BinaryNode newNode = new BinaryNode(data);if (index < 0 || index > capacity-1){throw new RuntimeException("索引超出范围");}if (this.elements[index].getLeftChild() != -1){throw new RuntimeException("该结点已有左孩子");}this.elements[index].setLeftChild(2*index+1);this.elements[2*index+1] = newNode;nodeCount++;}//为索引为i的结点添加右孩子结点/**** @param data 新结点存储的数据* @param i 为索引为i的结点添加右孩子*          新结点在数组中的索引为2*index+2*/public void addRightNode(int data, int index){BinaryNode newNode = new BinaryNode(data);if (index < 0 || index > capacity-1){throw new RuntimeException("索引超出范围");}if (this.elements[index].getRightChild() != -1){throw new RuntimeException("该结点已有左孩子");}this.elements[index].setRightChild(2*index+2);this.elements[2*index+2] = newNode;nodeCount++;}//递归删除某一索引的结点及其孩子(子树)public void delete(int index){if (index != -1){int l = elements[index].getLeftChild();int r = elements[index].getRightChild();//改变其父结点的索引值为-1;for (int i = 0; i < capacity; i++) {if (elements[i] != null){if (elements[i].getRightChild() == index){elements[i].setRightChild(-1);}if (elements[i].getLeftChild() == index){elements[i].setLeftChild(-1);}}}nodeCount--;elements[index] = null;delete(l);delete(r);}}//取得树中某一值的在数组的索引public void getNode(int data){for (int i = 0; i < capacity; i++) {if (elements[i] != null){if (elements[i].getData() == data){System.out.println(i);}else{System.out.println("树中没有该值的结点");}}}}//前序遍历/*** 从某一结点索引开始遍历* @param index 某一结点索引值*/public void frontTraversing(int index){if (index != -1){System.out.println(elements[index]);//输出中间结点frontTraversing(elements[index].getLeftChild());//递归左子树frontTraversing(elements[index].getRightChild());//递归右子树}}//中序遍历public void midTraversing(int index){if (index != -1){midTraversing(elements[index].getLeftChild());//递归左子树System.out.println(elements[index]);//输出中间结点midTraversing(elements[index].getRightChild());//递归右子树}}//后序遍历public void rareTraversing(int index){if (index != -1){rareTraversing(elements[index].getLeftChild());//递归左子树rareTraversing(elements[index].getRightChild());//递归右子树System.out.println(elements[index]);}}
}

Java用数组实现二叉树相关推荐

  1. java 数组 树_java使用顺序数组实现二叉树

    顺序数组实现二叉树 实现原理 对于下标为index的节点其满足 1.左孩子节点的下标为2index+1 2.右孩子节点的下标为2index+2 代码实现 package tree; public cl ...

  2. Java的数组集合概括

    Java的数组集合概括 Collection 1.List(存储有序,有索引,可以重复) 1.1.ArrayList 底层是数组实现的,线程不安全,查找和修改快,增删比较慢 1.2.LinkedLis ...

  3. 判断某数组是不是二叉树的前序遍历序列 python递归

    code class Solution:def VerifySquenceOfBST(self, sequence):# write code hereif len(sequence) <= 0 ...

  4. java中数组的复制

    数组复制使我们在编程过程中经常要使用到的,在java中数组复制我们大概能够分为两种,一种是引用复制,还有一种就是深度复制(复制后两个数组互不相干). 以下我们就通过測试的方法来具体看看什么是引用复制和 ...

  5. Java输出数组中最长递增子序列的代码

    下面内容是关于Java输出数组中最长递增子序列的内容,希望对大伙有较大用途. package com.wzs;import java.util.ArrayList; import java.util. ...

  6. Java中数组以及集合

    2019独角兽企业重金招聘Python工程师标准>>> java中数组: 数组在Java里是一种特殊类型,有别于普通的"类的实例"的对象.但实际数组也是一种对象类 ...

  7. 十六、深入Java的数组(下篇)

    @Author:Runsen @Date:2020/5/23 本专栏是付费学Java专栏,今天我们继续来说一下Java的数组. 文章目录 二维数组 获取长度 遍历 排序 练习 前面已经讲过了一维数组的 ...

  8. 十五、深入Java的数组(上篇)

    @Author:Runsen @Date:2020/5/23 本专栏是付费学Java专栏,今天我们来说一下Java的数组. 数组是相同类型的变量的集合,所有元素的类型都一样. 文章目录 创建使用数组 ...

  9. Java中数组的定义,怎么发现那个方括号放在变量名前或者后都是正确的?

    int array[]= new int[3]; int[] array= new int[3]; 我运行了都正确?? Java的数组定义支持两种格式: int[] a和int a[] 前者是Java ...

最新文章

  1. PAT Advanced Level 1010
  2. (亲测可行)基于面绘制的MC算法以及基于体绘制的 Ray-casting 实现Dicom图像的三维重建(python实现)
  3. 通过JAVA获取优酷、土豆、酷6、6间房等视频
  4. 英特尔芯片专利官司败诉,判罚140亿,半个季度白干了...
  5. python画简单的图形的代码-Python实现画图软件功能方法详解
  6. FIR数字滤波器设计——频率抽样法
  7. Android ble连接过程,Android开发之ble蓝牙
  8. 【ELK】ELK安装与配置
  9. JavaScript知识点查阅
  10. 计算机管理教学 (cmi) 包括( )等功能,计算机管理教学(CMI)的未来
  11. Python数据结构1-----基本数据结构和collections系列
  12. 漫画:什么是堆排序?
  13. http抓包实践--(四)-http压缩和url encode
  14. 单片机课设中期报告_毕业论文--中期检查情况报告(40页)详解.doc
  15. oracle 建表引号,oracle 创建表加双引号作用
  16. 我为什么读博, 以及我为什么不读博?这是个问题!
  17. ChatGPT 会开源吗?
  18. Zencart模板结构和设计详解
  19. FCN分割Pascal VOC 2007
  20. 近月计算机图书市场盘点:阳春三月好风光

热门文章

  1. matlab函数im2bw_图像分割之阈值分割(matlab)(转载)
  2. 中国古代十大武功卓著的北伐名将
  3. 司马懿为什么比诸葛亮略胜一筹?
  4. Java设计模式-工厂模式的详细记录
  5. 使用 imgaug 对图像进行数据增强 Data Augmentation
  6. Docker学习——docker高级
  7. Excel VBA:引用行和列——Rows属性和Columns属性
  8. JS 程序中可能存在的内存泄漏
  9. 八个小灯泡闪烁的c语言程序,C语言猜数游戏程序.doc
  10. 坐地铁飞机数秒进站,关于3D人脸识别闸机你知道的有多少?