顺序二叉树(Java)

顺序二叉树(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 
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值