二叉树相关概念及创建

二叉树的认识 设⼆叉树的根节点所在层数为1,层序遍历就是从所在⼆叉树的根节点出发,⾸先访问第⼀层的树根节点,然后从左到右访问第2层上的节点,接着是第三层的节点,以此类推,⾃上⽽下,⾃左⾄右逐层访问树的结点的过程就是层序遍历。如上图:A 结点的层次:从根开始定义起,根为第1层,根的⼦结点为第2层,以此类推。:若⼀个结点含有⼦结点,则这个结点称为其⼦结点的⽗结点;:以某结点为根的⼦树中任⼀结点都称为该结点的⼦孙。:⼀个结点含有的⼦树的根结点称为该结点的⼦结点;:度为0的结点称为叶结点;:具有相同⽗结点的结点互称为兄弟结点; 阅读详情

二叉树的一些性质:

度就是一个节点的分支数
对于任何一个 二叉树,如 果其叶节点的个数为n0,度为2的非叶节点个数是n2,则有n0=n2+1
(n0+n1+n2=2*n2+n1+1)——-(n0=n2+1);
度为1的非叶子节点个数为n1;
节点个数为n0+n1+n2;
边的个数为2*n2+n1;
节点的个数为:边的个数+1;
具有n个节点的完全二叉树的深度K为log2(n+1)向上取整。
一个具有n个节点的完全二叉树,如果按照从上至下从左到右的顺序对所有节点从0开始编号,则对于序号为i的节点有:

    1)若>0,双亲信号为:(i-1)/2;
            i=0;i为根节点编号,没有双亲
    2)若2i+1<n,左孩子编号:2i+1,否则没有左孩子
    3)若2i+2<n,右孩子序号:2i+2,否则无右孩子 

二叉树形如下图:

1、构建一个二叉树

树的结构体 :

typedef struct BinaryTreeNode//树的结构体
{
     Datatype data;
     struct BinaryTreeNode* LeftTree;
     struct BinaryTreeNode* RightTree;
}BTNode;

思想:创建一棵树,首先应该创建一个 新的树的根节点,遍历一个 数组,数组 的内容就是树的数据,当数组中为“#”时,代表是空树,使用递归的方法依次创建左子树和右子书。

代码如下:

BTNode* CreatTree(Datatype a[],int size,int* index)
{
     BTNode* pRoot = (BTNode*)malloc(sizeof(BTNode));
     assert(index);
     if((*index) >= size)//表示已经将数组遍历完了
     {
          return NULL;
     }
     if (a[*index] == '#')//代表子树为空的情况
     {
          (*index)++;
          return NULL;
     }
     //BTNode* pRoot = (BTNode*)malloc(sizeof(BTNode));
     pRoot->data = a[*index];
     (*index)++;
     pRoot->LeftTree = CreatTree(a, size, index);
     pRoot->RightTree = CreatTree(a, size, index);

     return pRoot;
}

2、前序遍历

递归方式
void Prevorder(BTNode* pRoot)//前序遍历
{
     if (pRoot == NULL)
     {
          return ;
     }
     printf("%c-", pRoot->data);//输出根节点
     Prevorder(pRoot->LeftTree);//递归左子树
     Prevorder(pRoot->RightTree);//递归右子树
}
非递归方式 :
void UnPrevorder(BTNode* pRoot)//前序遍历非递归
{
     Stack S;
     BTNode* pTop;
     StackInit(&S);//栈的初始化
     BTNode*  pCur=pRoot;
     while (!StackEmpty(&S) || (pCur != NULL))
     {
          while (pCur != NULL)
          {
              printf("%c ", pCur->data);//输出根节点
              StackPush(&S, pCur);//压栈,这个一定要注意,并不是单纯的把数据压入栈,而是将节点压入栈
              pCur = pCur->LeftTree;//继续寻找左子树,直到栈为空(遍历完成)或者pCur=NULL(所有的左子树遍历完成)
          }//左子树为空时开始寻找右子树
          pTop = Top(&S);
          StackPop(&S);
          pCur = pTop->RightTree;
     }
}

3、中序遍历

递归:
void Inorder(BTNode* pRoot)//中序遍历
{
     if (pRoot == NULL)
     {
          return NULL;
     }
     Inorder(pRoot->LeftTree);
     printf("%c-", pRoot->data);
     Inorder(pRoot->RightTree);
}
非递归:
void UnInorder(BTNode* pRoot)//中序遍历非递归
{
     Stack S;
     BTNode* pTop;
     StackInit(&S);//栈的初始化
     BTNode*  pCur = pRoot;
     while (!StackEmpty(&S) || (pCur != NULL))
     {
          while (pCur != NULL)
          {
              StackPush(&S, pCur);
              pCur = pCur->LeftTree;
          }
          pTop = Top(&S);
          StackPop(&S);
          printf("%c ", pTop->data);
          pCur = pTop->RightTree;
     }
}

4、后序遍历

递归
void Postorder(BTNode* pRoot)//后序遍历
{
     if (pRoot == NULL)
     {
          return NULL;
     }
     Postorder(pRoot->LeftTree);
     Postorder(pRoot->RightTree);
     printf("%c-", pRoot->data);
}
非递归:
void UnPostorder(BTNode* pRoot)//后序遍历非递归
{
     Stack S;
     BTNode* pTop;
     StackInit(&S);//栈的初始化
     BTNode*  pCur = pRoot;
     BTNode* Last = NULL;
     while (!StackEmpty(&S) || (pCur != NULL))//遍历完左子树
     {
          while (pCur != NULL)
          {
              StackPush(&S, pCur);
              pCur = pCur->LeftTree;
          }
          pTop = Top(&S);
          if (pTop->RightTree == NULL || pTop->RightTree==Last)
          {//若栈顶元素的右子树为空,那么就可以输出这个节点的数据,再将这个节点赋给last,、
              //如果一个节点的右字数=last,那个这个节点就可以输出
              printf("%c ", pTop->data);
              StackPop(&S, pTop);
              Last = pTop;
              continue;
          }
          pCur = pTop->RightTree;
     }
}

5、层序遍历

void UnLevelorder(BTNode* pRoot)//层序遍历非递归
{
     Quene q;
     BTNode* FrontNode;
     if (pRoot == NULL)
     {
          return NULL;
     }
     QueneInit(&q);
     QuenePush(&q, pRoot);
     while (!QueneEmpty(&q))
     {
          FrontNode = QueneFront(&q);
          QuenePop(&q);
          printf("%c ", FrontNode->data);
          if (FrontNode->LeftTree != NULL)
          {
              QuenePush(&q, pRoot->LeftTree);
          }
          if (FrontNode->RightTree != NULL)
          {
              QuenePush(&q, pRoot->RightTree);
          }
     }
     printf("\n");
}

6、求节点的数量

int CountOfNodeone(BTNode* pRoot)//求节点数量
{
     //static int n = 0;
     if (pRoot == NULL)
     {
          return NULL;
     }
     n++;
     CountOfNodeone(pRoot->LeftTree);
     CountOfNodeone(pRoot->RightTree);
     return n;
}
划分成子问题也可以解决
int CountOfNodetwo(BTNode* pRoot)//求节点数量,分解为子问题
{
     if (pRoot==NULL)
     {
          return NULL;
     }
     return CountOfNodetwo(pRoot->LeftTree) + CountOfNodetwo(pRoot->RightTree) + 1;
}

7、求叶子节点的个数

int CountOfLeafNode(BTNode* pRoot)//求叶子节点的个数
{
     if (pRoot == NULL)
     {
          return NULL;
     }
     if ((pRoot->LeftTree)== NULL&&(pRoot->RightTree== NULL))
     {
          return 1;
     }
     return CountOfLeafNode(pRoot->LeftTree) + CountOfLeafNode(pRoot->RightTree);

}

8、求第k层节点的个数

int CountKNode(BTNode* pRoot,int k)//求第K层节点的数量
{
     if (pRoot == NULL&&k==1)
     {
          return NULL;
     }
     if (pRoot != NULL&&k == 1)
     {
          return 1;
     }
     return CountKNode(pRoot->LeftTree, k - 1) + CountKNode(pRoot->RightTree, k - 1);
}

9、求树的深度

int DepthOfNode(BTNode* pRoot)//求一棵树的高度
{
     if (pRoot == NULL)
     {
          return NULL;
     }
     int left = DepthOfNode(pRoot->LeftTree);
     int right = DepthOfNode(pRoot->RightTree);
     return Max(left, right)+1;
}

10、查找某一个节点

BTNode* FindTreeNode(BTNode* pRoot, Datatype x)
{
     if (pRoot == NULL)
     {
          return NULL;
     }
     if (pRoot->data == x)
     {
          return pRoot;
     }
     BTNode* FoundNode;
     FoundNode=FindTreeNode(pRoot->LeftTree, x);
     if (FoundNode != NULL)
     {
          return FoundNode;
     }
     return FindTreeNode(pRoot->RightTree, x);
}

11、测试函数

test()
{
     char arr[] = { 'A', 'B', 'D', '#', '#','#','C', 'E', '#','#', 'F' };
     int i = 0;
     int ret = 0;
     int len = sizeof(arr) / sizeof(arr[0]);
     BTNode* Node;
     BTNode* pRoot = (BTNode*)malloc(sizeof(BTNode));
     pRoot = CreatTree(arr, len, &i);
     Prevorder(pRoot);
     printf("\n");
     UnPrevorder(pRoot);
     printf("\n");
     Inorder(pRoot);
     printf("\n");
     UnInorder(pRoot);
     printf("\n");
     Postorder(pRoot);
     printf("\n");
     UnPostorder(pRoot);
     printf("\n");
     ret = CountOfNodetwo(pRoot);
     printf("层序遍历:\n");
     UnLevelorder(pRoot);
     printf("节点总个数为:%d\n", ret);
     printf("叶子节点的个数为:%d\n", CountOfLeafNode(pRoot));
     printf("第%d层节点的个数为:%d\n",3,CountKNode(pRoot, 3));
     printf("该树的深度为:%d\n", DepthOfNode(pRoot));
     Node = FindTreeNode(pRoot, 'F');
     if (Node == NULL)
     {
          printf("没有找到!\n");
     }
     else
     {
          printf("数据为:%c", Node->data);
     }

}
二叉树常见面试题目 二叉树相关概念 满二叉树 在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且所有叶子节点都在同一层上! 完全二叉树 如果一棵具有N个结点的二叉树的结构与满二叉树的前N个结点的结构相同,称为完全二叉树! 叶子节点 度为0的结点称为叶结点,叶节点也称为终端节点,从图上看就是最下面的一层节点! 二叉树节点与接口 定义的二叉树的节点和本次需要实现的接口如下:&amp;amp;amp;amp;amp;lt;Bi... 阅读详情

相关推荐

Prometheus-2.53.1安装

Prometheus+Grafana安装

qlj062127的博客 1787

二叉树基本规律及其遍历

假设在一棵二叉树中,一共有 n0 个为度为 0 的结点,n1 个度为 1 的结点,n2 个度为 2 的结点。由于二叉树中所有结点的度只能是0、1、2,所以,整棵二叉树的结点个数 n = n0 + n1 + n2。当有剩余结点的完全二叉树的情况时, k = log₂ (n + 1) 计算出来的 k 一定为小数,则最终 k 为其整数部分 + 1 后的值。又因为每个结点都有一个双亲结点,即每一个结点都有一条连接双亲结点的边(根结点除外),所以总的边数为:结点个数 - 1。i = 0 为根结点,无双亲结点。

AwwzJ_0821的博客 2576

java结合Ai

Spring AI 是 AI 工程的应用框架。其目标是将Spring生态系统的设计原则(如可移植性和模块化设计)应用于AI领域,并促进使用POJO作为应用程序的构建块到AI领域。特征跨 AI 提供商的可移植 API 支持,适用于聊天、文本到图像和嵌入模型。支持同步 API 和流 API 选项。还支持下拉以访问特定于模型的功能。聊天模型亚马逊基岩人类学Cohere的命令AI21 Labs的侏罗纪-2Meta 的 LLama亚马逊的泰坦人类学克劳德Azure 开放式 AI。

qq_67832732的博客 2848

牛客网刷题笔记--树

1.一棵具有n个结点的完全二叉树的树高度(深度)是 A.[logn]+1 B.logn+1 C.[logn] D.logn-1 答案:A。二叉树的性质4。[]向下取整。 知识点:二叉树的性质:http://blog.youkuaiyun.com/tianlihua306/article/details/44621827 2.分别以下列序列构造二叉排

zhuhuyou4801的博客 9490

PLSQL 14.0.6 下载使用教程

众所周知,PLSQL 只是一个oracle第三方开发测试工具,它依赖oracle 客户端搭配使用,但是oracle 客户端有2G,相当庞大,不建议安装。所以我们如果下载安装好PLSQL,再下载好轻量级的支持远程链接的oracle客户端,这样搭配使用可以的话就最好了,答案是可以的。 第一步: PLSQL 下载与安装 PLSQL 14.0.6 下载地址 : https://www.allroundautomations.com/registered-plsqldev/ 下载下来,除了安装路径更改一下,

qq976511508的博客 2133

Cadence Virtuoso Layout 版图绘制

画好原理图,打好pin脚(pin最好以全大写的形式书写,以防后续操作中可能出现Bug) 查看所使用工艺库的design rule文件,确定栅格单位设置大小 在准备绘制的原理图界面启动layout XL/GXL 在layout界面按e,设置网格大小与design rule匹配 直接根据原理图生成版图 根据原理图连接关系显示版图中未连接的飞线 查看和更改原理图与版图中器件对应的链接关系 shift + f:显示器件版图细节 版图的构成:元器件(工艺厂商提供)、器件连接、阱连接、IO和PAD模拟电路

bobo_supper的博客 2万+

二叉树的建立

二叉树是数据结构中不可或缺的知识,在这里我稍做下复习,其实也是为了

dasgk的专栏 885

把 MANDT 锁进保险箱:ABAP Client Handling 与 Client Isolation(聚焦 AMDP 的 Client Safety )

本文探讨了ABAP系统中Client Handling与Client Isolation机制的演进,重点分析了AMDP环境下多租户隔离的风险与解决方案。传统ABAP SQL/CDS通过隐式Client过滤提供安全保障,而AMDP因其原生SQLScript特性容易绕过隔离机制。文章对比了旧时代依赖开发自觉的传参方式与新时代通过AMDP OPTIONS强约束的语法方案,详细介绍了CLIENT INDEPENDENT和CDS SESSION CLIENT DEPENDENT两种编译期安全机制,阐述了USING列表

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 337

中国高校计算机考研:计算机数据结构核心考点解析

队列和栈结构的概念理解 栈是仅限制在表的一端进行插入和删除运算的线性表,称插入、删除这一端为栈顶。表中无元素时为空栈。栈的修改是按后进先出的原则进行的。通常栈有顺序栈和链栈两种存储结构。 队列是一种运算受限的线性表,插入在表的一端进行,而删除在表的另一端进行,允许删除的一端称为队头,允许插入的一端称为队尾,队列的操作原则是先进先出的。队列也有顺序存储和链式存储两种存储结构。 ▶线性表中单链表相关算法设计与实现 一些基础但又重要的单链表相关算法,如: 1.打印单链表,void PrintList(L

张晨光老师的播客 670

YOLO11涨点优化:原创自研 | 魔改Bottleneck,具备多尺度和特征通道融合的结构

可以将C3k2_MSAMCS放在neck,或者backbone和neck同时修改,具体看自己数据集的涨点情况决定

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 1645

【AI编程】Claude Code 最强AI 编程利器项目实战详解

Claude Code 最强AI 编程利器项目实战详解

congge 7393

二叉树的基本概念

二叉树的相关概念

weixin_63091319的博客 2634

YOLOv13改进策略【特征提取层】| 引入注意力卷积模块RFAConv,关注感受野空间特征 助力yolov13精度提升

RFAConv:创新空间注意力和标准卷积运算感受野空间特征是针对卷积核设计的,根据卷积核大小动态生成。以3×3卷积核为例,它由非重叠滑动窗口组成,每个窗口代表一个感受野滑块。

Limiiiing的博客 359

数据结构:二叉树及相关操作

在实现二叉树前,我们要先对树产生一些基本的认识,才可以去实现它。树的用途非常广泛,向文件系统的目录树结构等。树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。有一个特殊的结点,称为根结点,根节点没有前驱结点。除根节点外,其余结点被分成M(M>0)个互不相交的集合T1、T2、……、Tm,其中每一个集合Ti(1<= i <= m)又是一棵结构与树类似的子树。每棵子树的根结点有且只有一个前驱,可以有0个或多个后继。因此,树是递归定义的。

2301_76986069的博客 4641

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

数据结构-5(二叉树)

【代码】数据结构-5(二叉树)

iamfromhuoxing的博客 334

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

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

C++实现的二叉树创建和遍历,超入门邻家小女也懂了

所有层的节点都达到最大数量,叶子除外的所有节点都有两个子节点,所有叶子都在最底一层(k)且数目为2^(k - 1)。如果删除最底一层的所有叶子它就是满二叉树,即除了最后一层,每层节点都达到最大数量 ,即有深度k的个节点数在左闭右开【2^(k-1)+1,2^k-1】区间内。1. 具有N个节点的完全二叉树的深度为[log2 N]+1,其中[x]为高斯函数,截尾取整。(3)若在任意一棵二叉树中,有n0个叶子节点,有n2个度为2的节点,则必有n0=n2+1。(1)如果i=1,则节点i是二叉树的根,无双亲......

汉阳Hann's Home 1万+

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数据结构:二叉树的递归实现(C实现)

/通过前序遍历的数组"ABD##E#H##CF##G##"构建二叉树//二叉树的销毁//二叉树节点个数//二叉树叶子节点个数//二叉树第K层节点个数//二叉树查找值为X的节点//二叉树前序遍历//二叉树中序遍历//二叉树后序遍历//层序遍历//判断二叉树是否是完全二叉树//创建二叉树的节点节点需要一个数据域,一个指向左孩子节点的指针,一个指向右孩子节点的指针。}BTNode;以上就是我对于二叉树的理解!!!

li209779的博客 2999

二叉树:树的创建和遍历

前面介绍的链表,栈,队列都是一种顺序容器,访问元素的时候都是通过位置来访问的。如果想要通过值的方式来获取数据,只能通过遍历的方式。这在时间上消耗比较大。而二叉树可以做到不用遍历就可以通过值的方式来获取数据。二叉树是按值来保存元素,也按值来访问元素。 二叉树的相关术语: 树的结点:包含一个数据元素及若干指向子树的分支; 孩子结点:结点的子树的根称为该结点的孩子; 双亲结点:B结点...

dianjie9145的博客 159

二叉树相关概念和性质

二叉树这里要求大家一定不能手懒,一定要多画图,只有画图画多了,才会逐渐掌握。loglog。

a7897989的博客 606

【数据结构】 二叉树

二叉树的相关操作和OJ题

qq_56251766的博客 1212

【数据结构——遍历二叉树和线索二叉树】

【数据结构——遍历二叉树和线索二叉树】 目录【数据结构——遍历二叉树和线索二叉树】一、遍历二叉树二级目录三级目录二、线索二叉树二级目录三级目录 一、遍历二叉树 二级目录 三级目录 二、线索二叉树 二级目录 三级目录 ...

lflcodeplus的博客 3651

二叉树创建、遍历、特点及术语等(C++)

(特别声明:非原创,文末有原文链接)

QENGFENG的博客 357

数据结构c版(2)——二叉树

二叉树概念精讲及实现

2301_77272486的博客 1181

二叉树详解:从基础概念到实际应用

二叉树是结点的有限集合,由根结点加上左子树和右子树组成(左、右子树也为二叉树,可为空)。每个结点的度≤2(不存在度大于 2 的结点);子树有左右之分,次序不可颠倒(二叉树是有序树);任意二叉树均由空树、仅根结点、仅左子树、仅右子树、左右子树均存在这几种情况复合而成。// 存储堆元素的数组int size;// 当前元素个数// 容量} HP;

2401_83794450的博客 814

数据结构基础:二叉树

树形结构中的所有节点度数最大为2,这样的树形结构被称为二叉树通过函数递归完成完全二叉树的创建申请节点空间存放数据编号如果存在左子树递归创建左子树如果存在右子树递归创建右子树。

m0_74317917的博客 1102

day22-二叉树

*二叉树节点类型*/int no;//编号//左子树根节点地址//右子树根节点地址treenode;

m0_75094223的博客 1751
上一篇: 堆
下一篇: 互联网、因特网以及万维网之间的区别和联系
ffsiwei
博客等级 码龄9年 72粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值