Huffman Tree压缩法

数据结构与算法练习---霍夫曼编码进行字符串和文件的压缩和解压 使用霍夫曼编码进行字符串和文件的压缩和解压实验 解压文件时出现错误 未解决 package huffmancoding; import jdk.internal.org.objectweb.asm.tree.TryCatchBlockNode; import sun.misc.OSEnvironment; import java.io.*; import java.util.*; /** * 将字符串保存为Huffman编码 * huffman编码是以霍夫曼树为基础的可变字长的前缀编码,也可以 阅读详情

霍夫曼树(HuffmAn Tree,以下简称ht)压缩法:
(据我猜测,RAR使用的就是这种算法)


数据结构:

    二叉树(如果不懂什么是二叉树,找一本大学的《数据结构》课本
看看,否则下面的很多名词都会看不懂)
    由于VB现在还不支持链表,所以记录二叉树有一点麻烦。建议使用
    以下的数据结构:

Public Type Node
    DAtA As DAtAType    '记录数据
    Left As Integer     '左子树的下标
    Right As Integer    '右子树的下标
End Type
Public HuffmAnTree() As Node

    如果有必要,还可以在Node中定义一个FAther As Integer来记录
父节点。
===========

这只是压缩的,解压的还没写好,写好了再贴上来:)
我只加了时间的优化,没有加空间的优化,所以是严格按照标准Huffman Tree做的,压缩比不太高,但速度很快
老规矩,没写注释^_^
注:其中Progress是TfrmMain上的一个ProgressBar,Status是一个StatusBar

const
  FileHead: string[8]='Huffman'#0;
  HeadSize=8;
  BufCount=$FFFF;

type
  TCode=array[0..255]of Byte;
  TNodeCode=record
    Ascii: Byte;
    Code: TCode;
  end;

procedure TfrmMain.Compress (SName, TName: string);
type
  PNode=^TNode;
  TNode=record
    Ascii, Code: Byte;
    Num: Integer;
    Left, Right, Father: PNode;
    CodeStr: TCode;
  end;
var
  SFile, TFile: file;
  Buf: array[1..BufCount]of Byte;
  Size, Wrote: Integer;
  Appears: array[0..255]of Integer;
  NodeNum: SmallInt;
  Nodes: array[1..256]of PNode;
  CodeNum: SmallInt;
  Codes: array[1..256]of TNodeCode;
  AscCodes: array[0..255]of TCode;
  I, J, ReadByte: Integer;
  P: PNode;
  {Varibles below are used for WriteBit}
  Bits, CurByte: Byte;
  OutBuf: array[1..BufCount]of Byte;
  BitsSize: Word;

  procedure BuildCode (P: PNode);
  begin
    if P=nil then Exit;
    with P^ do
     begin
       CodeStr:= Father^.CodeStr;
       Inc (CodeStr[0]);
       CodeStr[CodeStr[0]]:= Code;
     end;
    if P^.Left=nil then
     begin
       Inc (CodeNum);
       Codes[CodeNum].Code:= P^.CodeStr;
       Codes[CodeNum].Ascii:= P^.Ascii;
       Exit;
     end;
    BuildCode (P^.Left);
    BuildCode (P^.Right);
  end;

  procedure FreeTree (P: PNode);
  var
    R: PNode;
  begin
    if P=nil then Exit;
    R:= P^.Left;
    FreeTree (R);
    R:= P^.Right;
    FreeTree (R);
    Dispose (P);
  end;

  procedure WriteBit (Bit: Byte);
  var
    Temp: Byte;
  begin
    Dec (Bits);
    Temp:= Bit shl Bits;
    CurByte:= CurByte or Temp;
    if Bits=0 then
     begin
       Bits:= 8;
       Inc (BitsSize);
       OutBuf[BitsSize]:= CurByte;                  
       CurByte:= 0;
       if BitsSize=BufCount then
        begin
          BlockWrite (TFile, OutBuf, BitsSize);
          BitsSize:= 0;
          FillChar (OutBuf, SizeOf(OutBuf), 0);
        end;
     end;
  end;

  procedure FlushBit;
  begin
    if (Bits=8) and (BitsSize=0) then Exit;
    if Bits<>8 then
     begin
       Inc (BitsSize);
       OutBuf[BitsSize]:= CurByte;
     end;
    BlockWrite (TFile, OutBuf, BitsSize);
    Bits:= 8;
    CurByte:= 0;
    BitsSize:= 0;
    FillChar (OutBuf, SizeOf(OutBuf), 0);
  end;

begin
  Canceled:= False;
  Bits:= 8;
  CurByte:= 0;
  BitsSize:= 0;
  FillChar (OutBuf, SizeOf(OutBuf), 0);

  btnCancel.Enabled:= True;
  AssignFile (SFile, SName);
  AssignFile (TFile, TName);
  Status.SimpleText:= '正在扫描输入文件...';
  Reset (SFile, 1);
  FillChar (Appears, SizeOf(Appears), 0);
  while not Eof(SFile) do
   begin
     BlockRead (SFile, Buf, BufCount, ReadByte);
     for I:= 1 to ReadByte do Inc (Appears[Buf[I]]);
   end;
  CloseFile (SFile);
  Status.SimpleText:= '正在生成哈夫曼树...';
  NodeNum:= 0;
  FillChar (Nodes, SizeOf(Nodes), 0);
  for I:=0 to 255 do
    if Appears[I]>0 then
     begin
       New (P);
       with P^ do
        begin
          Ascii:= I;
          Code:= 2;
          Num:= Appears[I];
          Left:= nil;
          Right:= nil;
          Father:= nil;
          FillChar (CodeStr, SizeOf(CodeStr), 0);
        end;
       J:= 1;
       while (J<=NodeNum) and (Nodes[J]^.Num>=P^.Num) do Inc (J);
       Inc (NodeNum);
       Move (Nodes[J], Nodes[J+1], (NodeNum-J)*SizeOf(Nodes[J]));
       Nodes[J]:= P;
     end;
  if NodeNum=1 then Nodes[1]^.Code:=0;
  while NodeNum>1 do
   begin
     New (P);
     with P^ do
      begin
        Num:= 0;
        Ascii:= 0;
        Code:= 2;
        Left:= nil;
        Right:= nil;
        Father:= nil;
        FillChar (CodeStr, SizeOf(CodeStr), 0);
      end;
     P^.Right:=Nodes[NodeNum];
     Nodes[NodeNum]^.Father:= P;
     Nodes[NodeNum]^.Code:= 1;
     Inc (P^.Num, Nodes[NodeNum]^.Num);
     Dec (NodeNum);
     P^.Left:=Nodes[NodeNum];
     Nodes[NodeNum]^.Father:= P;
     Nodes[NodeNum]^.Code:= 0;
     Inc (P^.Num, Nodes[NodeNum]^.Num);
     J:= NodeNum;
     while (J>=2) and (Nodes[J-1]^.Num<=P^.Num) do Dec (J);
Move (Nodes[J], Nodes[J+1], (NodeNum-J)*SizeOf(Nodes[J]));
Nodes[J]:= P;
end;
CodeNum:= 0;
if Nodes[1]<>nil then
    if Nodes[1]^.Left=nil
     then
      begin
        CodeNum:= 1;
        with Codes[1] do
         begin
           Ascii:= Nodes[1]^.Ascii;
           FillChar (Code, SizeOf(Code), 0);
           Code[0]:=1;
         end;
      end
     else
      begin
        BuildCode (Nodes[1]^.Left);
        BuildCode (Nodes[1]^.Right);
      end;
  FreeTree (Nodes[1]);
  FillChar (AscCodes, SizeOf(AscCodes), 0);
  for I:= 1 to CodeNum do
    with Codes[I] do
      AscCodes[Ascii]:= Code;

  Status.SimpleText:= '正在写输出文件...';
  Reset (SFile, 1);
  Rewrite (TFile, 1);
  BlockWrite (TFile, FileHead[1], HeadSize);
  BlockWrite (TFile, CodeNum, SizeOf(CodeNum));
  for I:= 1 to CodeNum do
    with Codes[I] do
     begin
       BlockWrite (TFile, Ascii, SizeOf(Ascii));
       BlockWrite (TFile, Code[0], SizeOf(Code[0]));
       for J:= 1 to Code[0] do WriteBit (Code[J]);
       FlushBit;
     end;

  Size:= FileSize(SFile);
  BlockWrite (TFile, Size, SizeOf(Size));      
  Wrote:= 0;
  Progress.Min:= 0;
  Progress.Max:= Size;
  while not Eof(SFile) do
   begin
     BlockRead (SFile, Buf, BufCount, ReadByte);
     for I:= 1 to ReadByte do
       for J:= 1 to AscCodes[Buf[I], 0] do
         WriteBit (AscCodes[Buf[I], J]);
     Inc (Wrote, ReadByte);
     Progress.Position:= Wrote;
   end;
  FlushBit;
  CloseFile (TFile);
  CloseFile (SFile);

  Status.SimpleText:= '完成';
  btnCancel.Enabled:= False;
end;


----
Worms Armageddon的武器介绍:
Homing Missile: Every home should have one.
Longbow: Robin Who?
... 

算法原理:

    ht首先被提出来,是为了解决这样的问题:

    对于N种数据(比如5种数据:A、B、C、D、E),在出现的频率已
知的情况下(比如分别出现了3、5、2、6、4次),如何用不等长的01
串来分别表示它们,使01串的总长度最短。

    比如原始串:ABADBCBDABEDBDEDCEDE

    对于这个问题,首先得到:任何一个01串都不能是其他01串的前缀
。也就是说,如果用“10”来表示A,那么其他01串就不能以“10”开
头。
    建立01串的步骤如下:

    首先找到出现最少的两个数据(A、C),分别以它们为左右子树,
建立一个二叉树。并将它们出现次数之和作为根节点:

1)

    5   5B  6D  4E
   / /
  3A 2C

    然后从剩下的4个数举重找到两个最小的,做同上的操作,知道只
剩一个数据为止:

2)

    5     9    6D
   / /   / /
  3A 2C 5B 4E
  
3)

      11      9
     /  /    / /
    5   6D  5B 4E
   / /
  3A 2C
  
4)
           20
          /  /
       11      9
      /  /    / /
     5   6D  5B 4E
    / /
   3A 2C

    最后从根节点开始,每个左子树填0,右子树填1:

             ROOT
            /    /
           0      1
          / /    / /
         0  1D  0B 1E
        / /
       0A 1C

    这样每个数据对应的01串就是从根节点到数据所在的叶子节点的路
径:

A: 000
B: 10
C: 001
D: 01
E: 11

    这样原始串ABADBCBDABEDBDEDCEDE就成了:

000100000110001100100010110110011101001110111


压缩:

    把256个Ascii码看作256种数据,分析它们出现的次数,建立ht,
得到256个01串。用这256个01串去替换原来的字符并按照二进制处理,
就可以得到压缩后的文件了。

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 01 算法设计 阅读详情

相关推荐

SpyGlass Lint脚本实战:从环境配置到报告生成的完整流程解析

本文详细解析了使用SpyGlass Lint脚本进行数字芯片设计代码质量检查的完整自动化流程。从环境配置、目录结构设计,到核心TCL脚本的编写与模块化配置,再到脚本执行、调试技巧及报告解读,提供了构建健壮、可维护自动化检查框架的实战指南。文章重点阐述了如何通过脚本实现从环境配置到报告生成的一键式操作,并探讨了与企业级CI/CD流程集成的进阶方案。

weixin_29196613的博客 441

huffman压缩

文件压缩是在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高传输、存储火绒处理效率,同时可以对数据加密保护(加密算法),增强数据在传输过程中的安全性有损压缩,可能丢失一些信息,不能还原到与源文件一样的,适合图片压缩,压缩率会更好无损压缩,压缩后的压缩文件可以被还原成与源文件完全相同的格式。

m0_73284013的博客 1464

保姆级教程:用SSC Tool 5.13为先楫HPM6E00EVK生成8轴EtherCAT从站代码(含XML配置详解)

本文详细介绍了如何使用SSC Tool 5.13为先楫HPM6E00EVK开发板配置8轴EtherCAT从站,包括XML文件深度配置、代码生成与工程整合、烧录与调试技巧。教程涵盖从环境准备到性能优化的全流程,帮助开发者快速实现符合CIA402标准的8轴控制。

weixin_30352645的博客 260

哈夫曼 (Huffman) 树的动画演示

 哈夫曼 (Huffman) 树的动画演示: http://people.cs.pitt.edu/~kirk/cs1501/animations/Huffman.html 此网站中亦有诸多其它算法的动画演示,可供学习算法或是数据结构相关内容时参考。

教学 & 技术专栏 4338

海康VisionMaster零代码开发实战:从PLC工程师到视觉专家的捷径

本文为PLC工程师提供了利用海康VisionMaster视觉平台实现零代码视觉开发的实战指南。文章详细阐述了如何通过图形化流程设计替代传统编程,快速搭建视觉检测应用,并实现与PLC的无缝通讯,是工程师从设备控制迈向视觉系统集成的有效捷径。

weixin_29201859的博客 293

ESP32C6+ESP-IDF5.2实战:基于RS485的ModbusRTU从站开发与调试

本文详细介绍了基于ESP32C6和ESP-IDF5.2开发ModbusRTU从站的实战指南。涵盖硬件连接、协议实现、ESP-Modbus库移植、寄存器映射及调试技巧,帮助开发者快速构建稳定可靠的工业级RS485通信节点,并解决常见通信故障。

play7的博客 1189

基于Huffman树的文件压缩(详细)

文件压缩 开发平台:Visual Studio 2008 开发技术:哈夫曼树,堆排序 项目流程: (1)统计要压缩的文件中各字符出现的次数,利用数据结构中的小堆来构建Huffman树,每次在堆顶选出两个出现次数较小的字符先进行构建,将它们相加的结果又放进堆里面,直到堆里面的数据被取完,这样字符出现次数多的离Huffman树的根节点就比较近,字符出现次数少的离Huffman树的根节点就比较远...

ypt 8600

Minitab正交试验设计:从入门到精通的完整指南

本文提供了一份使用Minitab进行正交试验设计的完整指南。从正交试验省时省力的原理讲起,详细介绍了在Minitab中创建正交表、填入数据、执行分析(包括解读ANOVA和P值)以及寻找最优参数组合的全流程。文章旨在帮助读者,特别是工艺优化和研发人员,快速掌握这一高效工具,从而用最少的实验次数锁定关键影响因素,提升工作效率与成果。

weixin_29201313的博客 469

算法导论实践——贪心算法范例HuffmanTree(霍夫曼树)

算法导论实践——贪心算法范例HuffmanTree(霍夫曼树)理论贪心算法原理实践队列优先队列的堆实现MinHeap.csMinPriorityQueue.cs霍夫曼树实现 很早之前就接触过了,今天知道霍夫曼树竟然是贪心算法,是我等级太低了。 理论 设C是最优前缀编码树,B(C)为编码树的代价则 优化子结构: 令C’ = C - z, 且x、y为C中值两个结点,有Z.Key = x.Key...

不定期更新系统使用、编程小技巧,哔哩哔哩账号:https://space.bilibili.com/399455629,欢迎关注 689

YOLOv11改进-上采样 | EUCB高效上卷积块,实现特征图尺度匹配和高效上采样

本文介绍了一种在YOLOv11目标检测模型中引入高效解码器模块EMCAD的创新方法,以提升模型在资源受限场景下的性能与效率。EMCAD由多个模块构成,其中核心的EUCB(高效上卷积块)通过上采样、深度可分离卷积、激活归一化和通道调整等操作,兼顾了特征质量与计算成本。实验结果显示,该模块在显著减少参数与FLOPs的同时仍具备优异性能。文章还提供了完整的YOLOv11模型集成流程、配置和训练实战。

魔改工程师的博客 1540

公文流转系统

公文录入区 | QLineEdit(文号/标题)、QComboBox(公文类型/紧急程度)、QTextEdit(正文)、QListWidget(附件列表)、QPushButton(上传附件/保存草稿/提交审批) |// 按时间范围获取。QStringList userNames = {"张三", "李四", "王五", "赵六", "钱七", "孙八", "周九", "吴十", "郑十一", "王十二"};

寒寒豆豆软件公司的博客 551

Huffman算法压缩解压缩(C)

Huffman压缩算法是一种基于字符出现频率的编码算法,通过构建Huffman树,将出现频率高的字符用短编码表示,出现频率低的字符用长编码表示,从而实现对数据的压缩。以下是Huffman压缩算法的详细流程:统计字符频率:遍历待压缩的数据,统计每个字符出现的频率。构建优先队列:将每个字符及其频率作为一个结点放入优先队列(或最小堆)中,根据字符频率构建一个按频率大小排序的优先队列。

baidu_34971492的博客 1757

化工设计软件:AutoCAD Plant 3D二次开发_(1).AutoCADPlant3D概述

AutoCAD Plant 3D 是一款专为化工行业设计的三维工厂设计和建模软件。它基于AutoCAD平台,提供了强大的三维建模功能和专业的化工设计工具,帮助工程师和设计师在工厂设计过程中提高效率和准确性。AutoCAD Plant 3D不仅能够创建详细的三维模型,还可以进行管道设计、设备布置、支架设计等复杂任务。通过上述案例,我们可以看出 AutoCAD Plant 3D 在化工厂设计中的强大功能和优势。该软件不仅提供了丰富的建模工具和专业的设计功能,还支持二次开发,使用户能够根据具体需求进行定制化操作。

kkchenjj的博客 1108

C语言Huffman压缩和解压

符号表结构体: struct node { // 字符串形式存储的Huffman编码 char code[MAX_CODE_LENGTH]; // 这个字符在文件中出现的次数 long count; // 在生成Huffman树的时候是否已经被当作叶子节点 int checked; // 符号 ...

aoningxun2220的博客 904

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

哈夫曼树Huffman Tree及其应用——哈夫曼编码

构造这种树的算法最早由哈夫曼于1952年提出的,因此称之为哈夫曼树。 **什么是哈夫曼树(Huffman Tree)+概念 ** (1)带权路径长度(WPL):设二叉树有n个叶子结点,每个叶子结点带 有权值 wk,从根结点到每个叶子结点的长度为 Lk,则每个叶子结 点的带权路径长度之和就是:WPL=w1L1+w2L2+…+wn*Ln。 最优二叉树或哈夫曼树: WPL最小的二叉树 。 (2)结点的权:在许多的应用中,将树中的结点赋予一个有着实际意义的数值,称此数值为该结点的权。 (3)结点的带权路径长

further_的博客 1796

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

基于HuffmanTree的文件压缩及解压缩

目录   HuffmanTree 定义 名词解释 性质 创建HuffmanTree 定义HuffmanTree节点 构造函数 参数解释 构建思想 析构函数 获取根节点 文件压缩及解压缩 哈夫曼编码 压缩思路 压缩文件格式 解压缩 完整的项目 HuffmanTree 定义 哈弗曼树是一种优化的二叉树,称为最优二叉树,是加权路径长度最小的二叉树。所谓权值在这里...

yulong__li的博客 577

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

huffmanTree压缩数据(文件)

HuffmanTree的学习让我了解到了,压缩文件的原理之一。 huffmanTree:叶子结点权值*从根节点到该结点的路径长度。 通过哈夫曼树构造出一个哈夫曼map,对文件或数据的bytes进行压缩。 解压缩则通过,哈夫曼map键值对 对调的map,对压缩的bytes进行解码。 下面是压缩文件数据的代码: import java.io.*; import java.util.*; pu...

eddie's Blog 266

huffman算法实现文件的压缩与解压

本文采用哈夫曼编码的方式进行文件的压缩和解压缩,主要原理是通过huffman编码来表示字符,出现次数多的编码短,出现次数少的编码长,这样整体而言,所需的总的bit位是减少的。但是当大部分字符出现的频率都差不多时,huffman压缩的压缩率就会很低。 一.利用 哈夫曼编码压缩文件,主要分为两部分: 1.压缩文件主要步骤: (1).统计出文件中各个字符出现的次数; (2)

qq_29503203的博客 1万+

基于HuffmanTree的文件压缩及解压

个人博客传送门 HuffmanTree 定义 名词解释 性质 创建HuffmanTree 节点定义 构造函数 参数解释 构建的思想 析构函数 获取根节点函数 补充 文件压缩及解压缩 哈夫曼编码 压缩思路 压缩原理 压缩与解压代码分析 结构体分析 构造函数 压缩函数 构建哈夫曼编码函数 解压函数 代码 HuffmanTree 定义 哈弗曼树是一种...

mac_timmy 1135

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

a bit 215

C# 数据结构和特殊类型

.NET Core(现称.NET)提供丰富数据结构,优化性能与开发效率。日常开发首选List<T>和Dictionary<TKey,TValue>;高性能场景推荐Span<T>与Memory<T>减少内存分配;并发环境使用ConcurrentDictionary等线程安全集合;避免非泛型集合如ArrayList。

cccloveforever的博客 746

pandas 深度入门:从数据结构到一份真实销售报表

本文系统讲解Pandas核心应用,从三分钟安装到完整月度报表生成,涵盖数据读取、清洗、筛选、分组聚合、表连接、透视表与时间序列等13个关键环节。强调“先看数据再动手”,掌握Series/DataFrame/Index结构本质,熟练运用loc/iloc、merge校验、agg/transform区别,通过真实案例实现高效报表自动化,告别手动Excel操作。最后提供性能优化与高频报错解决方案,助力读者快速上手,真正实现“写二十行代码,跑三秒出结果”。

信息安全领域优质创作者|操作系统领域专家 313

Re:Mysql数据库基础篇(十一):索引的常见操作、聚簇与非聚簇索引、为什么其他数据结构不能作为索引的底层结构

本文深入解析MySQL索引底层原理,对比链表、二叉树、B树等数据结构的局限性,阐明InnoDB选用B+树的原因:节点仅存键值与指针,叶节点相连,支持高效范围查询。进一步区分聚簇索引(InnoDB)与非聚簇索引(MyISAM),揭示回表查询机制及空间优化逻辑。最后系统介绍主键、唯一、普通及全文索引的创建方式与特点,全面梳理索引应用实践。

小此方的博客 209

数据结构的基本概念和算法的初步认识

本文系统阐述数据结构与算法的基础概念,涵盖数据、数据元素、数据对象的层次关系,数据结构的三要素(逻辑结构、存储结构、数据运算),以及抽象数据类型。重点解析算法的特性与设计要求,并深入讲解时间复杂度分析的核心——大O表示法,通过“只保留最高阶项、忽略常数系数、取最坏情况”三大原则,结合实例剖析O(1)、O(n)等常见时间复杂度,揭示算法效率的本质评估方法。

ACH_YYX的博客 204

【数据结构】堆(Heap):堆的实现、建堆与堆排序

堆是一种特殊的完全二叉树,分为大堆(父节点≥孩子)和小堆(父节点≤孩子),可快速获取最值。堆通常用数组存储,通过下标计算父子关系。核心操作为向上调整(插入时)和向下调整(删除或建堆时),时间复杂度均为O(log N)。建堆可采用从后往前的向下调整法,整体复杂度为O(N)。基于堆的堆排序通过反复提取最大值实现升序排列,总时间复杂度为O(N log N),空间复杂度O(1),是高效稳定的排序算法。

2501_93577780的博客 378

C++ 数据结构与面向对象:二叉搜索树实现与多态虚函数详解

本文系统讲解二叉搜索树(BST)的迭代实现与C++多态及虚函数底层原理。BST通过非递归方式实现插入、查找、删除,核心在于维护有序性,删除分三种情况处理,替换法为关键技巧。多态基于虚函数表(vtable)与虚函数指针(vfptr),通过基类指针调用重写函数实现运行时动态绑定,需满足继承与虚函数重写条件。抽象类强制接口规范,虚函数表存储函数地址,子类继承或覆盖对应项。二者分别体现数据结构高效性与面向对象灵活性,是C++核心知识点。

2603_95129722的博客 210
上一篇: csdn-blog让人惊讶.请看!
下一篇: Windows Debuggers: Part 1: A WinDbg Tutorial
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值