【刷题复习巩固】编程实现:可变长有序数组的插入(无重复数据结点)

package com.dunka.chapter3;

/**
 * @Author Dunka
 * @Description p33
 * @Date 21:42   2019/7/19
 * @ClassName TestIn3_3
 */
public class TestIn3_3 {
    public static void main(String[] args) {
        insertArray(6);
    }

    /*编程实现:可变长有序数组的插入(无重复数据结点)
    *   可变长数组的实现:新建数组,复制旧数组并增加长度
    *   最后旧数组指向新数组
    *   1.遍历一遍数组,找出可插入的位置
    *   2.将前半段复制,插入数据,再复制后半段
    *   3.旧数组指向新数组*/
    public static void insertArray(int data){
        int[] array = {1,3,4,7,9};
        System.out.println("原数组为:");
        for (int i : array) {
            System.out.print(i+"  ");
        }
//        index为插入的数据的位置,以长度赋值,是为了假设是最大,防止比值到最后没有比它大的
        int index=array.length;
        System.out.println();
//        遍历数组,找出位置
        for (int i = 0; i <array.length ; i++) {
            if(array[i]>data){
                index =
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 这道目要求我们用数组实现一个二叉树,并按照定义顺序存储。具体实现可以参考树的定义,将树的点从数组下标1开始存储,然后按照父节点、左子树、右子树的顺序存储。这样可以保证能够快速访问到任意一个点的信息。 ### 回答2: 顺序存储的二叉树也叫做完全二叉树,又叫满二叉树,因为在一颗完全二叉树中,除了底层节点可能有一些空缺外,其他每一层的节点都是满的。下面是一种基于数组的完全二叉树的定义方式,每个点都包含一个值和两个子节点。 ```c++ #include<iostream> #include<cstring> using namespace std; const int MAXSIZE = 100; // 数组的最大度 class ArrayBinaryTree{ private: int* _array; // 动态分配内存的数组 int _capacity; // 数组的最大容量 public: ArrayBinaryTree(int capacity = MAXSIZE){ // 构造函数 _array = new int[capacity+1]; // 动态分配内存 memset(_array, 0, sizeof(int)*(capacity+1)); // 初始化数组为0 _capacity = capacity; // 记录数组的最大容量 } ~ArrayBinaryTree(){ // 析构函数 delete[] _array; } void setValue(int i, int value){ // 设置某个点的值 if(i<1 || i>=MAXSIZE) // 校验数组下标的合法性 return; _array[i] = value; } int getValue(int i){ // 获取某个点的值 if(i<1 || i>=MAXSIZE) // 校验数组下标的合法性 return -1; return _array[i]; } int leftChild(int i){ // 获取某个点的左子节点下标 if(i<1 || i>=MAXSIZE) // 校验数组下标的合法性 return -1; int left = i*2; if(left>_capacity) // 左子节点位置超出数组范围,表示该点没有左子节点 return -1; return left; } int rightChild(int i){ // 获取某个点的右子节点下标 if(i<1 || i>=MAXSIZE) // 校验数组下标的合法性 return -1; int right = i*2+1; if(right>_capacity) // 右子节点位置超出数组范围,表示该点没有右子节点 return -1; return right; } }; // 测试代码 int main(){ ArrayBinaryTree tree(10); tree.setValue(1, 10); tree.setValue(2, 20); tree.setValue(3, 30); tree.setValue(4, 40); tree.setValue(5, 50); cout<<tree.getValue(1)<<" "<<tree.getValue(2)<<" "<<tree.getValue(3)<<" "<<tree.getValue(4)<<" "<<tree.getValue(5)<<endl; cout<<tree.leftChild(1)<<" "<<tree.rightChild(1)<<endl; // 2 3 cout<<tree.leftChild(2)<<" "<<tree.rightChild(2)<<endl; // 4 5 return 0; } ``` 在上面的代码中,树的点从数组下标1开始存储,因此我们需要处理一些下标的边界情况,例如,获取某个点的左子节点下标时,如果该点的下标为i,那么它的左子节点下标应该是2*i,但是如果2*i超出了数组的范围,就表示该点没有左子节点,因此需要返回-1。类似的,获取右子节点下标时,应该返回2*i+1。这种方式实现的完全二叉树,可以很方便地进行遍历、查找、插入和删除等操作,但是需要注意数组的大小限制,如果需要存储太多的点,就需要使用其他的数据构,例如链式存储的二叉树。 ### 回答3: 顺序存储的二叉树是一种利用数组实现树形构的方法,每个节点的位置与数组下标一一对应,且根节点存储在数组下标1的位置上。它的一些基本特点包括: 1. 在顺序存储的二叉树中,每个节点都必须按照某种顺序存储,否则节点之间的关系将无法正确建立。 2. 顺序存储的二叉树在自身构上没有链式存储的灵活,但由于沿用了数组的部分特性,对于访问整个树而言,要比链式存储的树更方便。 下面我们可以定义一个简单的顺序存储二叉树的数据构: ``` #define MAXSIZE 100 //定义二叉树节点最多个数 typedef int ElementType; //定义元素类型 typedef struct TreeNode *BinTree; //定义指向二叉树节点的指针 struct TreeNode{ ElementType Data; int Left; int Right; }T1[MAXSIZE]; //定义数组存储二叉树,T1[0]表示空节点 BinTree CreateBinTree(){ BinTree T; T = (BinTree)malloc(sizeof(struct TreeNode)); return T; } ``` 在这里,我们首先定义了一个二叉树节点的构体,其中包含了节点中存储的元素类型、左右节点的数组下标信息。接着,合宏定义的最大节点数和二叉树节点指针的定义,我们将其一并存储在了数组中,这样就完成了顺序存储的二叉树的初始化。 为了方便使用,我们还可以定义节点插入的操作: ``` BinTree Insert(ElementType X){ int i; for(i = 1;i<MAXSIZE;i++){ if(T1[i].Data == NULL){ T1[i].Data = X; T1[i].Left = 0; T1[i].Right = 0; return &T1[i]; } } printf("\nerror: over maxsize\n"); return NULL; } ``` 需要注意的是,这里插入的节点并未指定其父节点等信息,因此对于这一类操作的实现,需要通过数组下标定位父节点所在的位置。此外,在每个节点的数组位置上我们可以存储更多的节点信息,如节点度数、高度、颜色、等等。这样,在实际应用中,可能会根据具体问进行修改和扩充。 总之,顺序存储的二叉树是一种巧妙的数据实现,相比链式存储的树具有更为便捷的查询等优点,在某些场合下能够发挥其应用价值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

多啦CCCC梦

你的鼓励将是我最大的创作动力~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值