当前位置: 首页 > article >正文

多叉树笔记

1 多叉树定义

多叉树是一种树形结构,它有一个特定的节点被称为“根”节点,而每个节点(除了根节点)恰好有一个前驱节点(父节点)。在有根多叉树中,每个节点可以拥有任意数量的后继节点(子节点)。

struct MultiTree{
    int val;
    vector<MultiTree*> children;
    MultiTree(int v):val(v){}
};

2 多叉树的构造

利用vector<int>parents记录每个节点的父节点
利用vector<MultiTree*>记录读入的每个节点(利用值先创建)
然后用关系 (multi[parents[i]-1]->children).push_back(multi[i]) 把每个节点连接起来。

void BuildMultiTree(vector<MultiTree*>& multi,vector<int> parents,int n){
    for(int i=1;i<n;i++){
        (multi[parents[i]-1]->children).push_back(multi[i]);
    }
}

3 逐层历遍打印多叉树

用队列辅助

void print_Multi(MultiTree* root){
    queue<MultiTree*> q;
    q.push(root);
    while(!q.empty()){
        MultiTree* temp=q.front();
        q.pop();
        //cout<<temp->val<<" ";
        for(int i=0;i<int(temp->children.size());i++){
            q.push(temp->children[i]);
        }
    }
}

4 多叉树到LC-RS二叉树的转变

LC-RS二叉树:左儿子右兄弟。以这种方式重排多叉树为二叉树。
ps.每个节点的左儿子一定使用它的所有儿子中的编号最小的,右兄弟一定使用比它编号大的兄弟中最小的兄弟的编号。

逻辑:
①先搞定根节点:LC-RS的根节点的值 永远等于 多叉树根节点的值
②左侧递归:左子树为 以多叉树根节点的第一个孩子为根节点的树
③右侧递归:右子树为空,左子树的右子树是 以多叉树根节点的下一个孩子为根节点的树
````````````````````````左子树的右子树的右子树是 以多叉树根节点的再下一个孩子为根节点的树
````直到多叉树的根节点的孩子节点全部安排好。

BiTree* Multi2Bi(MultiTree* root){
    if(!root) return NULL;

    BiTree* r=new BiTree(root->val);
    if(!root->children.empty()){
        r->lchild=Multi2Bi(root->children[0]);    //左递归
        BiTree* cur = r->lchild;

        for(int i=1;i<int(root->children.size());i++){
            cur->rchild=Multi2Bi(root->children[i]);
            cur=cur->rchild;                       //右递归
        }
    }
    return r;
}

http://www.kler.cn/a/393778.html

相关文章:

  • PyTorch深度学习与企业级项目实战-预训练语言模型GPT
  • 学法减分交管12123模拟练习小程序源码前端和后端和搭建教程
  • linux设置主机名
  • WebSocket和HTTP协议的性能比较与选择
  • 系统上线后发现bug,如何回退版本?已经产生的新业务数据怎么办?
  • request爬虫库的小坑
  • Linux 如何使用函数删除非空目录
  • Android11 修改系统语言
  • P10901 [蓝桥杯 2024 省 C] 封闭图形个数
  • scala创建图书信息类,包含三个属性:书名,作者,价格
  • Spring Boot框架:电商系统的快速开发
  • arcgis做buffer
  • 学习threejs,使用导入的模型生成粒子
  • 扫雷游戏代码分享(c基础)
  • 观察者模式 vs 不使用观察者模式:商品库存变化的通知
  • Spring框架之责任链模式 (Chain of Responsibility Pattern)
  • GDSC、CTRP数据库学习
  • ApiSmart-QWen2.5 coder vs GPT-4o 那个更强? ApiSmart 测评
  • 使用Java爬虫获取淘宝商品类目API返回值
  • Rust学习(一):初识Rust和Rust环境配置
  • Kafka Eagle 安装教程
  • ue5 蓝图学习(一)结构体的使用
  • 什么是 WPF 中的转换器?如何自定义一个值转换器?
  • 06-form-serialize插件的使用、案例
  • redis实现消息队列的几种方式
  • Swift 类型转换