手撕数据结构与算法——树(三指针描述一棵树)

简介: 手撕数据结构与算法——树(📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++阶段,因为最近参加新星计划算法赛道(白佬),所以加快了脚步,果然急迫感会增加动力>——目标Windows,MySQL,Qt,数据结构与算法,Linux,多线程,会持续分享学习成果和小项目的📖作者主页:king&南星📖专栏链接:数据结构🎉欢迎各位→点赞👏 + 收藏💞 + 留言🔔​💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🐾————————————————版权声明:本文为CSDN博主「热爱编程的小K」的原创文章,遵循CC 4.0 BY-S三指针描述一棵树)

9b9b67a20c5d4fddb2f4a78eda506af8.png

🏅文章目录

🌱树

一、🌲概念与定义

二、🌳定义与预备

三、🌴创建结点函数

四、🍀查找

五、🍁插入

六、🍃遍历

🌱树

一、🌲概念与定义

描述树结构:

和现实世界的树 反着画

根节点 枝干 叶子节点

同一层 兄弟 上层:父 叔叔 上层的上层:爷爷

下层:孩子 侄儿

树的高度:几代人

树退化成线性结构 : 一叉树(链表) N代单传

数据结构中的树是和现实倒着的

948f755b2fd24fd3994fa49db8a961aa.png

cf184e26f22745bc9bf90ab48ce529f4.png

详细解读:三个指针描述,一个指针指向父亲,一个指针指向兄弟,一个指针指向孩子,同时规则设定只有父亲的第一个孩子才可以有孩子

二、🌳定义与预备

先准备好头文件、结构体和函数声明

#define _CRT_SECURE_NO_WARNINGS 1

#include<stdio.h>

#include<stdlib.h>

#include<stdbool.h>

#include<assert.h>

typedef struct treeNode

{

int data;                  //数据

struct treeNode* pParent;  //指向父

struct treeNode* pBrother; //指向第一个兄弟

struct treeNode* pChild;   //指向第一个孩子

}treeNode;

#define SIZE sizeof(treeNode)

//创建节点函数

treeNode* createNode(int data);

//在树中找一个节点,找到返回这个节点的地址,找不到返回NULL

treeNode* findNode( treeNode* root, int findData);

//插入一个节点到树中

//把insertData插入到*pRoot树中 如果isChild为真成为findData节点的孩子,否则成为findData节点的兄弟

bool intsertNode( treeNode** pRoot, int findData, int insertData, bool isChild);

//遍历

void print_Tree(treeNode* root);

三、🌴创建结点函数

这里利用一个技巧,直接使用内存设置函数memset函数,把三个指针内存都设置为0

treeNode* createNode( int data )

{

treeNode* newNode = (treeNode*)malloc(SIZE);

assert(newNode);

memset(newNode, 0, SIZE);  //内存都设置为0

newNode->data = data;

return newNode;

}

四、🍀查找

在树中找一个节点,找到返回这个节点的地址,找不到返回NULL

先在while循环中遍历同一层的兄弟,直到他下一个兄弟为空,切换到下一层,如此循环下去,如果找到则返回地址,如果没找到则返回空

treeNode* findNode(treeNode* root, int findData)  

{

if (NULL == root) return NULL;  //防呆

treeNode* pTemp;

treeNode* pnextChild = root;

while (true)

{

 pTemp = pnextChild;

 if (NULL == pnextChild) break;

 while( true )

 {

  //遍历兄弟层

  if (NULL == pTemp) break;

  if (findData == pTemp->data) return pTemp;

  pTemp = pTemp->pBrother;

 }

 //切换到下一层(孩子)

 pnextChild = pnextChild->pChild;

}

return NULL;

}

五、🍁插入

描述:插入一个节点到树中,把insertData插入到*pRoot树中 如果isChild为真成为findData节点的孩子,否则成为findData节点的兄弟

99513581e3b440b6a188d5fe8dc0f923.png

bool intsertNode(treeNode** pRoot, int findData, int insertData, bool isChild)

{

if (NULL == pRoot) return false; //防呆

if (NULL == *pRoot) //空树

{

 *pRoot = createNode(insertData);

 return true;

}

treeNode* pFind = findNode(*pRoot, findData);  //查找

if (NULL == pFind) return false;

treeNode* pNew, * pTemp;

//找到了

if (isChild) //新节点成为pFind指向节点的孩子

{

 //有孩子,新节点成为pFind节点孩子的最小兄弟

 if (pFind->pChild)

 {

  pTemp = pFind->pChild;

  pNew = createNode(insertData);

  while (pTemp->pBrother) pTemp = pTemp->pBrother;

  pTemp->pBrother = pNew;

  pNew->pParent = pFind;

  return true;

 }

 //pFind指向的节点没有孩子

 else

 {

  //有父,pFind不是根节点

  if (pFind->pParent)

  {

   //pFind是pFind->pPartent的第一个孩子

   if (pFind->pParent->pChild == pFind)

   {

    pNew = createNode(insertData);

    pFind->pChild = pNew;

    pNew->pParent = pFind;

    return true;

   }

   else

   {

    //pFind不是pFind->pParent的第一个孩子

    //新节点只能成为 pFind->pParent->pChild的孩子

    intsertNode(&(pFind->pParent), pFind->pParent->pChild->data, insertData, true);

   }

  }

  //无父,pFind是根节点

  else

  {

   pNew = createNode(insertData);

   pFind->pChild = pNew;

   pNew->pParent = pFind;

   return true;

  }

 }

}

else //新节点成为pFind指向节点的兄弟

{

 pTemp = pFind;

 while (pTemp->pBrother) pTemp = pTemp->pBrother;

 pNew = createNode(insertData);

 pTemp->pBrother = pNew;

 pNew->pParent = pFind->pParent;

 return true;

}

return false;

}

六、🍃遍历

和查找函数异曲同工

void print_Tree(treeNode* root)  

{

if (NULL == root) return NULL;  //防呆

treeNode* pTemp;

treeNode* pnextChild = root;

int cnt = 1;

while (true)

{

 pTemp = pnextChild;

 if (NULL == pnextChild) break;

 printf("第[%d]层:", cnt++);

 while (true)

 {

  //遍历兄弟层

  if (NULL == pTemp) break;

  printf("%d ", pTemp->data);

  pTemp = pTemp->pBrother;

 }

 printf("\n");

 //切换到下一层(孩子)

 pnextChild = pnextChild->pChild;

}

}

版权声明:本文为CSDN博主「热爱程的小K」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_72157449/article/details/129628960

相关文章
|
2月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
221 4
|
2月前
|
存储 算法
算法入门:专题一:双指针(有效三角形的个数)
给定一个数组,找出能组成三角形的三元组个数。利用“两边之和大于第三边”的性质,先排序,再用双指针优化。固定最大边,左右指针从区间两端向内移动,若两短边之和大于最长边,则中间所有组合均有效,时间复杂度由暴力的O(n³)降至O(n²)。
|
5月前
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
143 2
|
7月前
|
存储 机器学习/深度学习 算法
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty  敏感词
|
7月前
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
196 17
|
7月前
|
存储 监控 算法
局域网上网记录监控的 C# 基数树算法高效检索方案研究
在企业网络管理与信息安全领域,局域网上网记录监控是维护网络安全、规范网络行为的关键举措。随着企业网络数据量呈指数级增长,如何高效存储和检索上网记录数据成为亟待解决的核心问题。基数树(Trie 树)作为一种独特的数据结构,凭借其在字符串处理方面的卓越性能,为局域网上网记录监控提供了创新的解决方案。本文将深入剖析基数树算法的原理,并通过 C# 语言实现的代码示例,阐述其在局域网上网记录监控场景中的具体应用。
179 7
|
6月前
|
机器学习/深度学习 算法 搜索推荐
决策树算法如何读懂你的购物心理?一文看懂背后的科学
"你为什么总能收到刚好符合需求的商品推荐?你有没有好奇过,为什么刚浏览过的商品就出现了折扣通知?
|
9月前
|
人工智能 算法 语音技术
Video-T1:视频生成实时手术刀!清华腾讯「帧树算法」终结闪烁抖动
清华大学与腾讯联合推出的Video-T1技术,通过测试时扩展(TTS)和Tree-of-Frames方法,显著提升视频生成的连贯性与文本匹配度,为影视制作、游戏开发等领域带来突破性解决方案。
314 4
Video-T1:视频生成实时手术刀!清华腾讯「帧树算法」终结闪烁抖动
|
9月前
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
257 3
 算法系列之数据结构-Huffman树
|
9月前
|
存储 自然语言处理 数据库
【数据结构进阶】AVL树深度剖析 + 实现(附源码)
在深入探讨了AVL树的原理和实现后,我们不难发现,这种数据结构不仅优雅地解决了传统二叉搜索树可能面临的性能退化问题,还通过其独特的平衡机制,确保了在任何情况下都能提供稳定且高效的查找、插入和删除操作。
737 19

热门文章

最新文章