Java数据结构——二叉树难点

文章目录

  • 二叉树难点
    • 1. 难点一:二叉树的存储
      • 1.1 C语言版
      • 1.2 Java语言简陋版
      • 1.3 Java语言版改进
        • 1.3.1 例题
        • 1.3.2 改进方法
      • 1.4 Java源码汇总
    • 2. 难点二:不止一种方法存储二叉树

二叉树难点

1. 难点一:二叉树的存储

1.1 C语言版

void CreateBiTree(BiTree &T) {
   
	// C语言创建结点
	T = (BiTree)malloc(sizeof(BiTNode));
	// 向节点输值,例如:没有左节点就输入-1
	int data;
	scanf("%d",&data);
	if(data == -1) T = NULL;
	if(T) {
   
		T->data = data;
		printf("输入%d节点的左子节点:\n",data);
		CreatBiTree(T->lchild);
		printf("输入%d节点的右子节点:\n",data);
		CreatBiTree(T->rchild);		 
	} // end if
} // end CreatBiTree

1.2 Java语言简陋版

	/**
	 * 二叉树的存储
	 * 
	 * @return 二叉树
	 */
	public BinaryTree createBinaryTree() {
   

		// 创建根节点
		BinaryTree root = new BinaryTree(1);

		// 创建树枝,值域
		BinaryTree T_l = new BinaryTree(2);
		BinaryTree T_r = new BinaryTree(3);
		BinaryTree T_l_l = new BinaryTree(4);
		BinaryTree T_r_r = new BinaryTree(5);

		// 指针域
		root.lchild = T_l;
		root.rchild = T_r;
		T_l.lchild = T_l_l;
		T_r.lchild = T_r_r;

		return root;
	} // createBinaryTree

1.3 Java语言版改进

1.3.1 例题

Java数据结构——二叉树难点_第1张图片


1.3.2 改进方法
  • 空使用 0 来表示, 可以用一个向量来存储
    [1, 2, 3, 4, null,null,5]
    优点: 仅需要一个向量, 简单直接.
    缺点: 对于实际的二叉树, 很多子树为空, 导致大量的 0 值.

  • 应使用压缩存储方式, 即将节点的位置和值均存储. 可表示为两个向量
    值域:[1, 2, 3, 4, null,null,    5]
    位置:[0, 1, 2, 3,  4,   5,     6]

  • Java代码

	/**
	 * 压缩存储,构造二叉树
	 * @param values 数据域数组
	 * @param keys 下标数组
	 */
	public BinaryTree(int[] values, int[] keys) {
   
		
		// BinaryTree型的数组,装每一个节点
		int nodeNum = values.length;
		BinaryTree[] allNodes = new BinaryTree[nodeNum];
		for(int i=0; i<nodeNum; i++) {
   
			allNodes[i] = new BinaryTree(values[i]);
		}
		
		// 链接节点
		for(int i=1; i<nodeNum; i++) {
   
			for(int j=0; j<i; j++) {
   
				if(keys[i] == keys[j]*2+1) {
   
					allNodes[j].lchild = allNodes[i];
					break;
				}else if(keys[i] == keys[j]*2+2) {
   
					allNodes[j].rchild = allNodes[i];
					break;
				}
			}
		}
		
		// 根节点
		data = allNodes[0].data;
		lchild = allNodes[0]

你可能感兴趣的:(Java数据结构,java,数据结构,二叉树)