C++关于树的基础知识

news2024/11/19 17:39:14

首先区分概念

“度为m的树”指的是至少有一个结点的度是m,一定是非空树

“m叉树”指的是允许所有的结点都小于m,且可以是空树

常见考点:

度为m的树的第i层最多有m^{i-1}个结点  (对于m叉树也相同)

第一层m的0次方

第二层m的1次方

第三层m的2次方

第四层m的3次方

 高度为h的m叉树最多有\frac{^{m^{h}}-1}{m-1}个结点

 对于高度为h的m叉树至少有h个结点(每层只有一个结点)

对于高度为h的度为m的树至少有h+m-1个结点

 对于具有n个结点的m叉树的最小高度为\log _{m}(n(m-1)+1)

不用死记硬背:n<\frac{^{m^{h}}-1}{m-1}推导即可

 


二叉树

可能存在的五种形态:空二叉树、只有左子树(右子树为空)、只有右子树(左子树为空)、只有根节点、左右子树都有

满二叉树:一颗高度为h,且具有2^{h}-1个结点的二叉树

·只有最后一层有叶子结点

·不存在度为1 的结点

·从根节点开始从1编号,结点i的父节点为[i/2]

完全二叉树是一种特殊类型的二叉树,其中树的所有级别都被完全填充,除了最低级别的节点从尽可能左侧填充之外。

另外可以理解为:遍历一个完全二叉树的所有结点都能在满二叉树中找到一一对应的结点,满二叉树一定是完全二叉树,但是完全二叉树不一定是满二叉树

·只有最后两层有叶子节点

·最多只有一个度为1的结点

·从根节点开始从1编号,结点i的父节点为[i/2]

·i<=[n/2]为分支结点,i>[n/2]为叶子结点  ,其中n为最大的结点数

·如果某一个结点只有一个子节点,那么其一定是左子节点

二叉排序树。左子树上的所有结点关键字都小于根节点的关键字

右子树上的所有结点的关键字都大于根节点的关键字

同时左子树和右子树又各是一颗二叉排序树

平衡二叉树。树上的任一结点的左子树和右子树的深度之差不超过1

如果一个二叉排序树是一个平衡二叉树,则其搜索效率要高很多

二叉树考点

1、设非空二叉树中度为0、1和2的结点个数分别为n0、n1和n2,如n0=n2+1(叶子结点的个数要比二分支结点的个数多1个)

2、二叉树的第i层最多有2^{i-1}个结点

3、高度为h的二叉树最多有2^{^{h}}-1个结点

4、具有n个结点的完全二叉树的高度h为\log {_{2}}(n+1))

5、对于一个完全二叉树,给出了结点n的个数,可以直接推算出度为0\1\2的结点个数n0\n1\n2

        推到过程: 完全二叉树最多只会有一个度为1的结点,即n1=0或1

                        n0 = n2 +1,则叶子结点和双分支结点(度为2的结点)的总和、差都是奇数

                        如果一个完全二叉树给出的总结点个数是偶数个(2k),则n0=k,n1=1,n2=k-1

                        如果一个完全二叉树给出的总结点个数是奇数个(2k-1),则n0=k,n1=0,n2=k-1

对于一个完全二叉树,给定总结点的个数num,则n0= num/2 , n2 = n0-1  ,如果num是偶数,则n1= 1 , 如果Num是奇数, 则n1 = 0;

 6、对于顺序存储的二叉树的结点i ,其

左子结点:2i

右子结点:2i+1 

父节点: [i/2]

i所在的高度h : log2(n+1)\log {_{2}}(n+1))\log {_{2}}(n+1))

 对于完全二叉树,总结点数n:


判断i是否有左子节点:2i<=n?

判断i是否有右子节点:2i+1<=n?

判断是否是叶子结点还是分支结点: i 与[n/2]对比

对于完全二叉树,要有结点数与分支结点数对半分割的思想:


二叉树遍历方式:

先序遍历:根-左-右: A-BDE-CFG

中序遍历:左-根-右:DBE-A-FCG

后序遍历:左-右-根:DEB-FGC-A

 

先序遍历:根-左-右:A-BDGE-CF

中序遍历:左-根-右:DGBE-A-FC   (G是右节点)

后序遍历:左-右-根:GDEB-FC-A

求取数的深度:

int treeDepth (BiTree T){
    if(T==NULL){
        return 0;
    }
}
    else {
        int l = treeDepth(T->lchild)
        int r = treeDepth(T->rchild)
        return l>r ? l+1 :r+1;
}

层序遍历:

思想:初始化一个队列queue,让根节点入队,如果队列Q非空,则pop一个元素并读取访问,将其指向的左子节点和右子节点插入队列,然后重复上述

struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x),left(NULL),right(NULL){}
}
void levelOrder(TreeNode* root)
{
    if(root ==NULL ) return ;
    queue<TreeNode*> q;
    q.push(root);
    while(!q.empty())
    {
        TreeNode* cur = q.front();
        q.pop();
        
        //输出当前结点的值
        cout <<cur ->val <<endl;        
    
        if(cur->left !=NULL){
            q.push(cur->left);
        }
        if(cur->right!=NULL)    
        {
            q.push(cur->right);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2199992.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何帮助企业进行有效的专利管理?

专利管理是企业创新发展的重要支撑&#xff0c;有效的专利管理不仅能保护企业的创新成果&#xff0c;还能提升企业的核心竞争力。那么&#xff0c;究竟该如何帮助企业进行有效的专利管理呢&#xff1f;接下来&#xff0c;本文将为您详细解答。 一、专利管理对企业的重要性 1. 保…

[ROS2]解决PyQt5和sip的各种报错问题 stderr: qt_gui_cpp

前言 编译ros环境的时候遇到了qt_gui_cpp各种编译问题&#xff0c;但是鉴于网上解决方法基本没有&#xff0c;故记录下来帮助后来者。整篇文章总结下来就是一句话&#xff1a;PyQt5和sip安装过程或安装版本有问题&#xff0c;需要重新安装。 问题与解决方法 如果PyQt5你是正…

华为OD机试 - 处理器问题(Python/JS/C/C++ 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试真题&#xff08;Python/JS/C/C&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;私信哪吒&#xff0c;备注华为OD&#xff0c;加入华为OD刷题交流群&#xff0c;…

一文了解:LLM Dropout

咱们来聊聊&#xff0c;啥样的预测模型才算是好模型&#xff1f;简单来说&#xff0c;就是那种在处理它从没见过的数据时&#xff0c;也能表现得特别棒的模型。老派的泛化理论告诉我们&#xff0c;要想让模型在训练集和测试集上都表现差不多&#xff0c;就得让模型简单点。这个…

以一个B站必剪应用Bug过一下CVSS 4.0评分

Bug的内容就是Mac上的必剪无法完成B站视频上传新手任务。 这个从B站客服那里确认了。 没多大事儿,这是个设备相关的bug,我们也可以认为这样的小bug对用户是无害的,此时评分为0,无影响,但从学习角度出发我们将部分评分提高到L,也就是假设这是个CVE的话,聊一下安全问题。…

为什么推荐你一定要弄懂千门八将108局,学会做局思维的人有多么的厉害?

在纷繁复杂的社会与商业环境中&#xff0c;能够洞悉事物本质、预见趋势并巧妙布局的人&#xff0c;往往能在竞争中脱颖而出&#xff0c;成为时代的弄潮儿。而“千门八将108局”这一古老而深邃的智慧体系&#xff0c;不仅蕴含了中国传统文化中对于策略、心理学、人际交往的深刻理…

Java 集合实现类

Java 集合实现类 ​ Java 提供了一套实现了 Collection 接口的标准集合类。其中一些是具体类&#xff0c;这些类可以直接拿来使用&#xff0c;而另外一些是抽象类&#xff0c;提供了接口的部分实现 序号类描述1AbstractCollection 实现了大部分的集合接口。2AbstractList 继承…

java中日期时间类的api

目录 1. Instant 类 构造方法 1&#xff09;Instant.now()&#xff1a;获取当前时间戳。 常用方法 1&#xff09;plus(Duration duration) 2&#xff09;minus(Duration duration) 3&#xff09;toEpochMilli() 4&#xff09;ofEpochMilli(long epochMilli) 5&#xff09;案例:…

网站建设公司哪家好?好的网站建设公司应该有哪些特别之处?

面对众多的网站建设公司&#xff0c;企业该如何选择呢&#xff1f;如何才能避坑呢&#xff1f;本文将探讨好的网站建设公司应该具备的特别之处 案例&#xff0c;这是最直观的表现&#xff0c;一个好的网站建设公司必然拥有为数众多的的案例展示&#xff0c;且这些案例质量高&a…

基于resnet网络【系列】多类别图像识别、迁移学习:猫狗分类实战

目录 1、前言 2、resnet 猫狗分类实战 2.1 训练 2.2 推理 3、更换数据集训练 1、前言 ResNet&#xff08;残差网络&#xff09;是一种深度卷积神经网络架构&#xff0c;广泛用于图像分类任务。它是由微软研究院的研究人员于2015年推出的&#xff0c;以其通过使用残差连接…

Python| 如何使用 DALL·E 和 OpenAI API 生成图像(1)

引言 想象一下&#xff0c;只要描述你想要的画面&#xff0c;电脑就能帮你画出来。这在几年前还像是科幻小说里的场景&#xff0c;但随着神经网络和潜在扩散模型&#xff08;LDM&#xff09;技术的发展&#xff0c;现在已经成为可能。OpenAI 推出的 DALLE 工具&#xff0c;因其…

vue项目刷新后h5样式失效

vue项目刷新后h5样式失效 今天遇到一个bug&#xff0c;有一个Element的message组件&#xff0c;用它做的一个进度条&#xff0c;它是写在一个页面上&#xff0c;并且是用js控制dom元素的 web端一切正常&#xff0c;h5如果从别的页面跳过来也正常&#xff0c;但是&#xff0c;H…

服装生产管理:SpringBoot框架的高效策略

5 系统的实现 5.1 登录界面的实现 用户要想进入本系统必须进行登录操作&#xff0c;进入对应角色登录界面&#xff0c;在登录界面输入系统账号、登录密码&#xff0c;选择登录类型&#xff0c;点击登录按钮进行登录系统&#xff0c;管理员登录界面展示如图5-1所示&#xff0c…

【STM32开发之寄存器版】(八)-定时器的编码器接口模式

一、前言 1.1 编码器接口原理 编码器模式主要用于检测旋转编码器的转动方向和转动速度。旋转编码器一般输出两路相位相差90度的脉冲信号&#xff08;称为A相和B相&#xff09;&#xff0c;通过这两路信号&#xff0c;定时器可以判断编码器的旋转方向&#xff0c;并计数转动的脉…

嵌入式学习-线性表Day03-栈

嵌入式学习-线性表Day03-栈 栈 顺序栈 2&#xff09;入栈 3&#xff09;出栈 链式栈 栈 什么是栈? 只能在一端进行插入和删除操作的线性表&#xff08;又称为堆栈&#xff09;&#xff0c;进行插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底 栈特点&#xff1a; 先进…

儿童(青少年)可以参加哪些含金量高的比赛?

随着素质教育的推进&#xff0c;越来越多的家长和老师开始关注如何培养孩子的综合素质和能力。而参加各类比赛&#xff0c;不仅可以锻炼孩子的思维、动手能力和团队合作精神&#xff0c;还能帮助孩子在学习的过程中找到兴趣点和成就感。尤其是一些含金量高的比赛&#xff0c;不…

什么是静态加载-前端

什么是前端静态加载 在前端开发中&#xff0c;静态加载是一种常见且重要的技术。简单来说&#xff0c;前端静态加载指的是在页面加载时将所需的资源&#xff08;如HTML、CSS、JavaScript、图片等&#xff09;一并加载到用户的浏览器中。这种方式有助于提高页面的加载速度和用户…

【宽搜】6. leetcode 513 找树左下角的值

1 题目描述 题目链接&#xff1a;找树左下角的值 2 题目解析 思路&#xff1a; 可以使用 层序遍历&#xff0c; 将每一层的值都存入到一个vector< int> 中&#xff0c;当这一层是最后一层的时候&#xff0c;将vector< int>中的第一个值返回即可。 3 代码 cla…

RemoteView(kotlin)

使用场景&#xff1a;通知栏&桌面部件 自定义通知栏 通知权限申请 manifest配置 <uses-permission android:name"android.permission.POST_NOTIFICATIONS" />权限动态申请 package com.example.kotlinlearn.Common;import android.Manifest; import an…

国产长芯微LDUM8801光耦兼容的单通道隔离式栅极驱动器P2P替代UCC23513 FOD8342 TLP5751成本低,质量更好

描述 LDUM8801是单通道兼容光耦输入的隔离式栅极驱动器&#xff0c;可应用于驱动IGBT、SiC 和 MOSFET。它可以提供5A的峰值拉/灌电流。支持150kV/μs的最小共模瞬态免疫&#xff08;CMTI&#xff09;&#xff0c;确保了系统的鲁棒性。驱动器的最大电源电压为32V。 其与光耦式栅…