数据结构——树(补充)

本文深入探讨了二叉树与哈夫曼树的概念,包括森林与二叉树之间的转换,哈夫曼树的构建算法及其应用,以及二叉树的遍历和线索化过程。通过实例讲解了如何创建、遍历二叉树,以及计算其高度、节点数和叶子节点数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一:内容补充
(一)森林转化
森林转换为二叉树
⑴ 将森林中的每棵树转换成二叉树;
⑵ 从第二棵二叉树开始,
依次把后一棵二叉树的根结点作为前一棵二叉树根结点的右孩子,
当所有二叉树连起来后,此时所得到的二叉树就是由森林转换得到的二叉树。
二叉树转换为树或森林
⑴ 加线——若某结点x是其双亲y的左孩子,则把结点x的右孩子、右孩子的右孩子、……,都与结点y用线连起来;
⑵ 去线——删去原二叉树中所有的双亲结点与右孩子结点的连线;
⑶ 层次调整——整理由⑴、⑵两步所得到的树或森林,使之层次分明。
森林有两种遍历方法:
⑴前序(根)遍历:前序遍历森林即为前序遍历森林中的每一棵树。
⑵后序(根)遍历:后序遍历森林即为后序遍历森林中的每一棵树。
叶子结点的权值:对叶子结点赋予的一个有意义的数值量。
二叉树的带权路径长度:设二叉树具有n个带权值的叶子结点,从根结点到各个叶子结点的路径长度与相应叶子结点权值的乘积之和。
(二)哈夫曼树
1)哈夫曼树:给定一组具有确定权值的叶子结点,带权路径长度最小的二叉树。
2)哈夫曼树的特点:

  1. 权值越大的叶子结点越靠近根结点,而权值越小的叶子结点越远离根结点。
  2. 只有度为0(叶子结点)和度为2(分支结点)的结点,不存在度为1的结点.
    3)哈夫曼算法基本思想:
    ⑴ 初始化:由给定的n个权值{w1,w2,…,wn}构造n棵只有一个根结点的二叉树,从而得到一个二叉树集合F={T1,T2,…,Tn};
    ⑵ 选取与合并:在F中选取根结点的权值最小的两棵二叉树分别作为左、右子树构造一棵新的二叉树,这棵新二叉树的根结点的权值为其左、右子树根结点的权值之和;
    ⑶ 删除与加入:在F中删除作为左、右子树的两棵二叉树,并将新建立的二叉树加入到F中;
    ⑷ 重复⑵、⑶两步,当集合F中只剩下一棵二叉树时,这棵二叉树便是哈夫曼树。
    哈夫曼编码:
    编码:给每一个对象标记一个二进制位串来表示一组对象。
    例:ASCII,指令系统
    等长编码:表示一组对象的二进制位串的长度相等。
    不等长编码:表示一组对象的二进制位串的长度不相等。
    前缀编码:一组编码中任一编码都不是其它任何一个编码的前缀 。
    前缀编码保证了在解码时不会有多种可能。
    (三)线索链表
    线索:将二叉链表中的空指针域指向前驱结点和后继结点的指针被称为线索;
    线索化:使二叉链表中结点的空链域存放其前驱或后继信息的过程称为线索化;
    线索二叉树:加上线索的二叉树称为线索二叉树。
    二叉树的遍历方式有4种,故有4种意义下的前驱和后继,相应的有4种线索二叉树:
    ⑴ 前序线索二叉树
    ⑵ 中序线索二叉树
    ⑶ 后序线索二叉树
    ⑷ 层序线索二叉树
    在这里插入图片描述
    二:
    例题
    1.采用二叉链表的方式进行存储
    2.构造一个二叉树类
    实现以下算法:
    1.创建二叉树
    2.对二叉树进行前序、中序、后序遍历
    #include<bits/stdc++.h>
    using namespace std;
    struct node
    {
    char data;
    node *lchild,*rchild;
    };
    class Tree
    {
    public:
    Tree(){root=Creat();}
    ~Tree(){release(root);}
    void firstly(){firstly(root);}
    void midly(){midly(root);}
    void last(){last(root);}
    //void level();
    private:
    node *Creat();
    void release(node *bt);
    void firstly(node *bt);
    void midly(node *bt);
    void last(node *bt);
    node root;
    };
    node
    Tree::Creat()//构造函数
    {
    node *bt;
    char ch;
    cin>>ch;
    if(ch==’#’) bt=NULL;
    else
    {
    bt=new node;
    bt->data=ch;
    bt->lchild=Creat();
    bt->rchild=Creat();
    }
    return bt;
    }
    void Tree::firstly(node *bt)//前序遍历
    {
    if(btNULL) return;
    else
    {
    cout<data;
    firstly(bt->lchild);
    firstly(bt->rchild);
    }
    }
    void Tree::midly(node *bt)//中序遍历
    {
    if(bt
    NULL) return;
    else
    {
    midly(bt->lchild);
    cout<data;
    midly(bt->rchild);
    }
    }
    void Tree::last(node *bt)//后序遍历
    {
    if(btNULL) return;
    else
    {
    last(bt->lchild);
    last(bt->rchild);
    cout<data;
    }
    }
    void Tree::release(node *bt)//析构函数
    {
    if(bt
    NULL) return;
    else
    {
    release(bt->lchild);
    release(bt->rchild);
    delete bt;
    }
    }
    int Tree::Count(node *bt)//节点数
    {
    int number=0;
    if(btNULL)
    number=0;
    else
    number=Count(bt->lchild)+Count(bt->rchild)+1;
    return number;
    }
    int Tree::leaf(node *bt)//叶子节点数
    {
    int number=0;
    if(bt
    NULL)
    number=0;
    else if(bt->lchildNULL&&bt->rchildNULL)
    number=1;
    else
    number=leaf(bt->lchild)+leaf(bt->rchild);
    return number;
    }
    int Tree::height(node *bt)//树的高度
    {
    int lheight=0,rheight=0;
    if(bt==NULL)
    return 0;
    lheight=height(bt->lchild);
    rheight=height(bt->rchild);
    if(lheight>rheight)
    return lheight+1;
    else
    return rheight+1;
    }
资源下载链接为: https://pan.quark.cn/s/22ca96b7bd39 在当今的软件开发领域,自动化构建与发布是提升开发效率和项目质量的关键环节。Jenkins Pipeline作为一种强大的自动化工具,能够有效助力Java项目的快速构建、测试及部署。本文将详细介绍如何利用Jenkins Pipeline实现Java项目的自动化构建与发布。 Jenkins Pipeline简介 Jenkins Pipeline是运行在Jenkins上的一套工作流框架,它将原本分散在单个或多个节点上独立运行的任务串联起来,实现复杂流程的编排与可视化。它是Jenkins 2.X的核心特性之一,推动了Jenkins从持续集成(CI)向持续交付(CD)及DevOps的转变。 创建Pipeline项目 要使用Jenkins Pipeline自动化构建发布Java项目,首先需要创建Pipeline项目。具体步骤如下: 登录Jenkins,点击“新建项”,选择“Pipeline”。 输入项目名称和描述,点击“确定”。 在Pipeline脚本中定义项目字典、发版脚本和预发布脚本。 编写Pipeline脚本 Pipeline脚本是Jenkins Pipeline的核心,用于定义自动化构建和发布的流程。以下是一个简单的Pipeline脚本示例: 在上述脚本中,定义了四个阶段:Checkout、Build、Push package和Deploy/Rollback。每个阶段都可以根据实际需求进行配置和调整。 通过Jenkins Pipeline自动化构建发布Java项目,可以显著提升开发效率和项目质量。借助Pipeline,我们能够轻松实现自动化构建、测试和部署,从而提高项目的整体质量和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值