数据结构-Tree树

树的术语

        路径 顺着连接节点的边从一个节点到另一个节点,所经过的节点的顺序排列就称为“路径”。

        根 树顶端的节点称为‘根’。a.一个树只有一个根。b.从根到其他任何一个节点的路径必须有一条。

        叶节点 没有子节点的节点称为叶节点。一个树可以有很多叶节点。

        层 假设根为1。它的子节点就是第二层。依次类推。树的深度和深度基数为0。

        二叉树 如果树的中的每个节点最多只能有两个节点,这样的树就称为二叉树。二叉树的每个节点的两个子节点称为左子节点和右子节点。

        二叉搜索树(二叉排序树、二叉查找树) a. 若左/右子树不为空,则左/右子树上的所有节点的值均小/大于它的根节点的值。b.它的左右子树分别为二叉搜索树。3种遍历根节点位置(前,中,后)序遍历,层序遍历。优点:快速查找、插入、删除。

        红黑树是一种自平衡的二叉查找树。特性:1,每一个节点是红色的或是黑色的。2,根必须是黑色的。3,叶子节点是黑色的且值null。4,如果某一节点是红色的,那末它的子节点必须是黑色的(不能出现红节点与红节点相连)。5,对某节点,从该节点到其所有后代叶子节点的路径上,有相同的黑色节点。

        2-3-4树 2、3、4含义指一个 节点可能含有的子节点的个数。 每个节点最多有四个子节点和三个数据项。对于非叶节点,有1/2/3个数据项总有2/3/4个子节点。叶节点可能有1或2或3数据项。不存在null节点。与红黑树的许多操作相同。

        2-3树是最简单的B-树结构。比2-3-4树少存一个数据项和少一个子节点。

        通常磁盘存取时间比访问内存慢10000倍。其中磁盘驱动器每次最少读取一个数据块(按数据块的倍数),其大小总是2的倍数,假设一个数据块的大小为2的13次方,则256M需要大约31250块。

        B-树中所有节点的子节点的最大值m,称为B-树的的阶。一个3阶B-树的性质:1,根节点不是叶子节点,则至少有两个子节点。2,每个节点最大有3个字节点(最多有2个关键子)3,对于根节点储存元素的个数:1<=x<=m-1,对于非根节点元素的个数: m/2的上界-1<=x<=m-1;

        B+树 只有叶子节点带有卫星数据,其余中节点仅是索引。在数量相同的情况下,与B-树相比更加矮胖,因此查询的IO次数会更少,查询必须最终查到叶子节点,所有叶子节点形成有序链表,便于范围查询。

排序

        冒泡排序(升序):第一趟排序:1,比较两个元素(0位和1位)。2,如果左边元素比右边元素大,则交换两元素位置,否则不做任何动作。3,向右移一位,比较两个元素(1位和2位)。直到最后一位,则最大的元素排在最后一位。

        选择排序:第一趟:1,选择元素(0位),与其他位元素比较。2,将数组中值最小的索引记录下来。3,将0位与最小值索引位的值交换位置。第二趟:选择元素(1位),与其他位元素比较...

        选择排序和冒泡排序的比较次数是相同的,但交换次数明显小于冒泡排序。效率比冒泡排序高一点。

        插入排序:将一个数据插入到一个已经排序好的数据中。

//交换位置 
public static void swap(int[] a,int i,int j){
        //先保存a[j]的值
        int emp = a[j];
        //a[j]赋值
        a[j]=a[i];
        //给a[i]赋予a[j]的值
        a[i] =emp;
}
//冒泡排序
//外循环 数组的大小-1
for (int i = 0; i < arr.length-1; i++) {
    //初始比较次数 数组的大小-1
    //每次外循环,比较次数-1,
    for (int j=0;j<arr.length-1-i;j++){
            if (arr[j]>arr[j+1]) {
                swap(arr,j,j+1);
            }
       }
  }
//选择排序
//外循环依次,将数组最小的值与数组首位进行交换位置。
        for (int i = 0; i < arr.length - 1; i++) {
            //保存数组最小值的索引
            int minIndex =i;
            for (int j = i+1; j < arr.length; j++) {
                if(arr[j]< arr[minIndex]){
                    minIndex=j;
                }
            }
            swap(arr,i,minIndex);
        }
 //插入排序
        //从数组第二位到最后一位
        for (int i = 1; i < arr.length; i++) {
            int tem = arr[i];
            int in = i;
            //当前位比前一位小时,
            while (in>0 && arr[in-1]>tem){
                //当前位被赋值于前一位
                arr[in]=arr[in-1];
                in--;
            }
            //前一位被赋予当前位的值
            arr[in]=tem;
        }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值