ALV平衡树实现

1.1 基本介绍

平衡二叉树又称AVL树,是一种最早的自平衡二分搜索树结构,它是具有如下性质的二叉树:

  • 左、右子树是平衡二叉树;
  • 所有结点的左、右子树深度之差的绝对值≤1
  • 满二叉树一定是平衡二叉树,高度最低。
  • 完全二叉树也是平衡二叉树,叶子节点深度相差不为1

为了方便起见,给每个结点附加一个数字 = 该结点左子树与右子树的深度差。这个数字称为结点的平衡因子。这样,可以得到AVL树的其它性质(可以证明) :

任一结点的平衡因子只能取: -1、0、1如果树中任意一个结点的平衡因子的绝对值大于1,则这棵二叉树就失去平衡

1.2 LL平衡旋转

1、思路分析

插入的元素在不平衡的节点的左侧。

节点大小:T1 < z< T2 < x < T3 < y< T4

先让X的右子树变成以Y为根的子树,再让Y的左子树变成x的右子树。然后让X变成新的二叉树的根节点。

2、案例实现

B为轴,对A做了一次单向右旋平衡旋转

1.3 RR平衡旋转

1、思路分析

插入的元素在不平衡的节点的右侧的右侧。

节点大小:T4 < Y< T3 < x < T1 < Z< T2

先让X的左子树变成以Y为根的子树,再让Y的右子树变成x的左子树

2、案例实现

B为轴,对A做了一次单向左旋平衡旋转

1.4 LR平衡旋转

1、思路分析

插入的元素在不平衡的节点的左侧的右侧。

节点大小:T1 < x< T2 < z < T3 <y < T4

先对X进行左旋转,变成LL模式,然后继续右旋转

2、案例实现

对B做了一次逆时针旋转,对A做了一次顺时针旋转。( 先左后右)

1.5 RL平衡旋转

1、思路分析

插入的元素在不平衡的节点的右侧的左侧。

节点大小:T1 < Y< T2 < z < T3 <X < T4

先对X进行右旋转,变成RR模式,然后继续左旋转

2、案例实现

B做了一次顺时针旋转,对A做了 一次逆时针旋转。(先右后左)

1.6 代码实现

1、接口类:Map

package cn.alvtree.demo01;
// Map接口
public interface Map<K, V> {
   
    void put(K key, V value);
    V remove(K key);
    boolean contains(K key);
    V get(K key);
    void update(K key, V value);
    int size();
    boolean isEmpty();
}

2、工具类:FileOperation

package cn.alvtree.demo01;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Locale;
import java.util.Scanner;

// 文件相关操作
public class FileOperation {
   

    // 读取文件名称为filename中的内容,并将其中包含的所有词语放进words中
    public static boolean readFile(String filename, ArrayList<String> words){
   

        if (filename == null || words == null){
   
            System.out.println("filename is null or words is null");
            return false;
        }

        // 文件读取
        Scanner scanner;

        try {
   
            File file = new File(filename);
            if(file.exists()){
   
                FileInputStream fis = new FileInputStream(file);
                scanner = new Scanner(new BufferedInputStream(fis), "UTF-8");
                scanner.useLocale(Locale.ENGLISH);
            }
            else
                return false;
        }
        catch(IOException ioe){
   
            System.out.println("Cannot open " + filename);
            return false;
        }

        // 简单分词
        // 这个分词方式相对简陋, 没有考虑很多文本处理中的特殊问题
        // 在这里只做demo展示用
        if (scanner.hasNextLine()) {
   

            String contents = scanner.useDelimiter("\\A").next();

            int start = firstCharacterIndex(contents, 0);
            for (int i = start + 1; i <= contents.length(); )
                if (i == contents.length() || !Character.isLetter(contents.charAt(i))) {
   
                    String word = contents.substring(start, i).toLowerCase();
                    words.add(word);
                    start = firstCharacterIndex(
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个简单的 ABAP 代码示例,使用 ALV 技术实现物料数据报表的显示,包括物料号、物料描述、批次号和库存数量。 ``` REPORT z_material_report_alv. TABLES: mara, mard. DATA: BEGIN OF itab OCCURS 0, matnr TYPE mara-matnr, maktx TYPE mara-maktx, charg TYPE mard-charg, labst TYPE mard-labst, END OF itab. DATA: wa_layout TYPE lvc_s_layo, wa_fieldcat TYPE lvc_s_fcat. SELECT-OPTIONS: s_matnr FOR mara-matnr. SELECT mara~matnr mara~maktx mard~charg mard~labst FROM mara JOIN mard ON mara~matnr = mard~matnr INTO TABLE itab WHERE mara~matnr IN s_matnr. IF sy-subrc = 0. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid i_callback_top_of_page = 'TOP-OF-PAGE' it_fieldcat = wa_fieldcat i_save = 'A' TABLES t_outtab = itab EXCEPTIONS program_error = 1 OTHERS = 2. ELSE. WRITE: / '没有符合条件的数据。'. ENDIF. *&---------------------------------------------------------------------* *& Form TOP-OF-PAGE *&---------------------------------------------------------------------* * 输出表格标题 *----------------------------------------------------------------------* FORM top_of_page. DATA: wa_columns TYPE lvc_s_col, it_columns TYPE lvc_t_scol. CLEAR wa_columns. wa_columns-col_pos = 1. wa_columns-fieldname = 'MATNR'. wa_columns-ref_fieldname = 'MATNR'. wa_columns-tabname = 'ITAB'. wa_columns-outputlen = 18. APPEND wa_columns TO it_columns. CLEAR wa_columns. wa_columns-col_pos = 2. wa_columns-fieldname = 'MAKTX'. wa_columns-ref_fieldname = 'MAKTX'. wa_columns-tabname = 'ITAB'. wa_columns-outputlen = 40. APPEND wa_columns TO it_columns. CLEAR wa_columns. wa_columns-col_pos = 3. wa_columns-fieldname = 'CHARG'. wa_columns-ref_fieldname = 'CHARG'. wa_columns-tabname = 'ITAB'. wa_columns-outputlen = 15. APPEND wa_columns TO it_columns. CLEAR wa_columns. wa_columns-col_pos = 4. wa_columns-fieldname = 'LABST'. wa_columns-ref_fieldname = 'LABST'. wa_columns-tabname = 'ITAB'. wa_columns-outputlen = 15. APPEND wa_columns TO it_columns. wa_layout-grid_title = '物料数据报表'. wa_layout-zebra = 'X'. wa_layout-no_key = 'X'. CALL FUNCTION 'REUSE_ALV_GRID_DISPLAY' EXPORTING i_callback_program = sy-repid i_callback_top_of_page = ' ' it_fieldcat = it_columns is_layout = wa_layout TABLES t_outtab = itab EXCEPTIONS program_error = 1 OTHERS = 2. ENDFORM. "top_of_page ``` 这段代码与前面的示例类似,不同之处在于使用了 REUSE_ALV_GRID_DISPLAY 函数来显示数据。首先定义了一个内部表 itab,然后使用 SELECT 语句从 MARA 和 MARD 表中检索所需的数据,并将其存储在内部表中。接着,定义了一个 ALV 表格布局 wa_layout 和字段目录 wa_fieldcat,用于设置表格的显示格式和字段属性。最后,在 TOP-OF-PAGE 事件中使用 REUSE_ALV_GRID_DISPLAY 函数来显示数据,并设置表格标题、斑马线效果和无键选项等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值