顺序二叉树(Java)
二叉树的顺序存储是将二叉树的所有结点,按照一定的次序,存储到一片连续的存储单元中,主要针对完全二叉树。
重要性质
若对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,则对完全二叉树中任意 一个编号为 i 的结点有以下性质(i>=0):
- 节点为i 的左孩子结点编号为2i+1,右孩子结点编号为 2i+2; ;
- 若 i=0 ,则该结点是二叉树的根,无双亲;否则i>1 ,其双亲结点的编号为 ⌊(i-1)/2⌋ ;
- 若 2i+1>n ,则该结点无左孩子; 否则,编号为 2i =1的结点为其左孩子结点;
- 若 2i+2>n ,则该结点无右孩子结点;否则,编号为2i+2 的结点为其右孩子结点。
遍历方式
对含 n 个结点的完全二叉树从上到下且从左至右进行 1 至 n 的编号,然后依次存放在数组中,根据完全二叉树的性质,实现遍历!
1.前序遍历
public void preorder(int index) {//前序遍历
if(arr==null||arr.length==0) {
System.out.println("数组为空!");
}
System.out.print(arr[index]+" ");
if((index*2+1)<arr.length) {
preorder(2*index+1);//向左子树递归
}
if((index*2+2)<arr.length) {
preorder(2*index+2);//向右子树递归
}
}
2.中序遍历
public void infixorder(int index) {//中序遍历
if(arr==null||arr.length==0) {
System.out.println("数组为空!");
}
if((index*2+1)<arr.length) {
infixorder(2*index+1);//向左子树递归
}
System.out.print(arr[index]+" ");
if((index*2+2)<arr.length) {
infixorder(2*index+2);//向右子树递归
}
}
3.后序遍历
public void postorder(int index) {//后序遍历
if(arr==null||arr.length==0) {
System.out.println("数组为空!");
}
if((index*2+1)<arr.length) {
postorder(2*index+1);//向左子树递归
}
if((index*2+2)<arr.length) {
postorder(2*index+2);//向右子树递归
}
System.out.print(arr[index]+" ");
}
完整代码
以下图完全二叉树为例
public class Arraybinarytree2 {
public static void main(String[] args) {
String []arr= {"A","B","C","D","E","F"};
arraybinarytree arrbinarytree = new arraybinarytree(arr);
System.out.println("前序遍历结果为:");
arrbinarytree.perorder();
System.out.println();
System.out.println("中序遍历结果为:");
arrbinarytree.infixorder();;
System.out.println();
System.out.println("后序遍历结果为:");
arrbinarytree.postorder();
}
}
//定义Arraybinarytree
class arraybinarytree{
private String []arr;
public arraybinarytree(String[] arr2) {
this.arr=arr2;
}
public void perorder() {//重构
this.preorder(0);
}
public void infixorder() {
this.infixorder(0);
}
public void postorder() {
this.postorder(0);
}
public void preorder(int index) {//前序遍历
if(arr==null||arr.length==0) {
System.out.println("数组为空!");
}
System.out.print(arr[index]+" ");
if((index*2+1)<arr.length) {
preorder(2*index+1);//向左子树递归
}
if((index*2+2)<arr.length) {
preorder(2*index+2);//向右子树递归
}
}
public void infixorder(int index) {//中序遍历
if(arr==null||arr.length==0) {
System.out.println("数组为空!");
}
if((index*2+1)<arr.length) {
infixorder(2*index+1);//向左子树递归
}
System.out.print(arr[index]+" ");
if((index*2+2)<arr.length) {
infixorder(2*index+2);//向右子树递归
}
}
public void postorder(int index) {//后序遍历
if(arr==null||arr.length==0) {
System.out.println("数组为空!");
}
if((index*2+1)<arr.length) {
postorder(2*index+1);//向左子树递归
}
if((index*2+2)<arr.length) {
postorder(2*index+2);//向右子树递归
}
System.out.print(arr[index]+" ");
}
}
运行结果
前序遍历结果为:
A B D E C F
中序遍历结果为:
D B E A F C
后序遍历结果为:
D E B F C A
最后
以上就是执着蜜蜂最近收集整理的关于顺序二叉树(Java)的全部内容,更多相关顺序二叉树(Java)内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复