二叉树常用操作

用C语言实现二叉树的结构和常用操作 #include#include typedef float ElemType;typedef struct S_BiTNode//定义结点类型结构体{ElemType data;//数据域struct S_BiTNode * lchild;//左子树struct S_BiTNode * rchild;//右子树struct S_BiTNode * parent;//父结点}BiTNode;/** 阅读详情
  1. #include <iostream>
  2. #include <string>
  3. //using namespace std;
  4. int n=0,dep1=0,dep2=0,m=0,n1=0,n2=0;
  5. template <class T>
  6. struct BiNode   //二叉树的结点结构
  7. {
  8.   T data;       
  9.   BiNode<T> *lchild, *rchild;
  10. };
  11. template <class T>
  12. class BiTree
  13. {
  14. public:
  15.     BiTree() {root=NULL;}
  16.     BiTree(T ch);             //构造函数,初始化一棵二叉树,其前序序列由键盘输入
  17.     ~BiTree(void);         //析构函数,释放二叉链表中各结点的存储空间
  18.     BiNode<T>* Getroot();  //获得指向根结点的指针
  19.     void PreOrder(BiNode<T> *root);     //前序遍历二叉树
  20.     void InOrder(BiNode<T> *root);      //中序遍历二叉树
  21.     void PostOrder(BiNode<T> *root);    //后序遍历二叉树
  22.     void LeverOrder(BiNode<T> *root);   //层序遍历二叉树
  23.     int  Count(BiNode<T> *root);//计算结点个数
  24.     int  Depth(BiNode<T> *root);//计算深度
  25.     int  leafnum(BiNode<T> *root);//叶子节点个数
  26.     int  full(BiNode<T> *root);
  27. private:
  28.     BiNode<T> *root;         //指向根结点的头指针
  29.     BiNode<T> *Creat(T ch);     //有参构造函数调用
  30.     void Release(BiNode<T> *root);   //析构函数调用 
  31. };
  32. template<class T>
  33. BiTree<T>::BiTree(T ch)
  34. {   cout<<"请输入创建一棵二叉树的结点数据"<<endl;
  35.     this->root = Creat(ch);
  36. }
  37. template <class T>
  38. BiNode<T>* BiTree<T>::Creat(T ch)
  39. {
  40.     BiNode<T>* root;
  41.     //T ch;
  42.     //cout<<"请输入创建一棵二叉树的结点数据"<<endl;
  43.     cin>>ch;
  44.     if (ch=="#") root = NULL;
  45.     else{ 
  46.          root = new BiNode<T>;       //生成一个结点
  47.          root->data=ch;
  48.          root->lchild = Creat(ch);    //递归建立左子树
  49.          root->rchild = Creat(ch);    //递归建立右子树
  50.     } 
  51.     return root;
  52. }
  53. template<class T>
  54. BiTree<T>::~BiTree(void)
  55. {
  56.     Release(root);
  57. }
  58. template<class T>
  59. BiNode<T>* BiTree<T>::Getroot( )
  60. {
  61.     return root;
  62. }
  63. template<class T>
  64. void BiTree<T>::PreOrder(BiNode<T> *root)
  65. {
  66.     if(root==NULL)  return;
  67.     else{       
  68.         cout<<root->data<<" ";
  69.         PreOrder(root->lchild);
  70.         PreOrder(root->rchild);
  71.     }
  72. }
  73. template <class T>
  74. void BiTree<T>::InOrder (BiNode<T> *root)
  75. {
  76.     if (root==NULL)  return;      //递归调用的结束条件             
  77.     else{   
  78.         InOrder(root->lchild);    //中序递归遍历root的左子树
  79.         cout<<root->data<<" ";    //访问根结点的数据域
  80.         InOrder(root->rchild);    //中序递归遍历root的右子树
  81.     }
  82. }
  83. template <class T>
  84. void BiTree<T>::PostOrder(BiNode<T> *root)
  85. { 
  86.     if (root==NULL)   return;       //递归调用的结束条件
  87.     else{   
  88.         PostOrder(root->lchild);    //后序递归遍历root的左子树
  89.         PostOrder(root->rchild);    //后序递归遍历root的右子树
  90.         cout<<root->data<<" ";      //访问根结点的数据域
  91.     }
  92. }
  93. template <class T>
  94. void BiTree<T>::LeverOrder(BiNode<T> *root)
  95. {
  96.     const int MaxSize = 100;
  97.     int front = 0;
  98.     int rear = 0;  //采用顺序队列,并假定不会发生上溢
  99.     BiNode<T>* Q[MaxSize];
  100.     BiNode<T>* q;
  101.     if (root==NULL) return;
  102.     else{
  103.         Q[rear++] = root;
  104.         while (front != rear)
  105.         {
  106.             q = Q[front++];
  107.             cout<<q->data<<" ";         
  108.             if (q->lchild != NULL)    Q[rear++] = q->lchild;        
  109.             if (q->rchild != NULL)    Q[rear++] = q->rchild;
  110.         }
  111.     }
  112. }
  113. template<class T>
  114. void BiTree<T>::Release(BiNode<T>* root)
  115. {
  116.   if (root != NULL){                  
  117.       Release(root->lchild);   //释放左子树
  118.       Release(root->rchild);   //释放右子树
  119.       delete root;
  120.   }
  121. }
  122. template<class T>
  123. int BiTree<T>::Count(BiNode<T> *root)
  124. { 
  125.  if(root==NULL) return 0;
  126.  else
  127.  {
  128.   Count(root->lchild);
  129.   Count(root->rchild);
  130.   n++;
  131.  }
  132.  return n;
  133. }
  134. template <class T>
  135. int BiTree<T>::Depth(BiNode<T> *root)
  136. {
  137.  if (root==NULL) return 0;
  138.    else
  139.    {
  140.      dep1=Depth(root->lchild);//计算左子树深度
  141.      dep2=Depth(root->rchild);//计算右子树深度
  142.      if(dep1>dep2) return dep1+1;
  143.         else return dep2+1;
  144.    }
  145. }
  146. template <class T>
  147. int BiTree<T>::leafnum(BiNode<T> *root)//叶子节点个数
  148. {
  149.  if(root==NULL) return 0;
  150.  else
  151.  {
  152.   if(root->lchild==NULL && root->rchild==NULL)
  153.       m++;
  154.   leafnum(root->lchild);
  155.   leafnum(root->rchild);
  156.  }
  157.   return m;
  158. }
  159. template <class T>
  160. int BiTree<T>::full(BiNode<T> *root)
  161. {
  162.   if(root==NULL) return 0;
  163.     else 
  164.     {
  165.      if(root->lchild==NULL && root->rchild==NULL)
  166.          return 1;
  167.      else if (root->lchild==NULL || root->rchild==NULL)
  168.          return 0;
  169.         else return(full(root->lchild) && full(root->rchild));
  170.     }
  171. }
二叉树常用操作算法集、解释及注意事项 二叉树是一种常用的数据结构,在程序中也经常需要使用二叉树,但是你所使用语言却并不一定提供了二叉树这种数据类型,所以为了方便使用,我们可以自己实现一个二叉树的数据类型。在需要时就像使用其他已定义的类型一样方便。 下面给出一些本人写的算法和解释(基于C语言),希望对读者写一个二叉树数据类型有所帮助。 0、递归的四条基本法则 由于二叉树中的算法大多使用递归来实现,而且使用递归实现也 阅读详情

相关推荐

UM2 3D 打印机 DIY 实践 (2) 电路篇

涉及到的东西非常多,实际上后面还会讲到。主要部件清单: 主板 mega2560 + Ramps1.4 + LCD12864 各一张 42 x38mm x3,xyz 轴各一台 42 x23mm x1,用在挤出机 泰坦远程挤出机 x1 TMC2225 驱动板 x4, 替代a4988、TMC2208,静音效果好,性价比高 s-250-12v 20A开关电源 x1。功率必须足够大,宁可选大一点的 大功率 MOS 管,25A x1 NTC .

afeiqiang的专栏 3601

数据结构学习

1.找出树中所有权值为负数的结点(t为指向根结点的指针) int sum = 0; void count(Tree t){ if(t == NULL){ return ; }else{ if(t.value < 0){ sum ++; } count(t->left); count(t->right) } } 2. 二叉树转换为森林 假如一棵二叉树的根节点有右孩子,则这棵二叉树能够转换为森林,否则将转换为一棵树。 1.从根节点开始,若右孩子存在,则把与右

wavehaha的博客 357

非线性功率放大器对QAM传输BER性能的影响及补偿

1、线性功率放大器对传输性能的影响 为表述非线性功率放大器对传输性能的影响,以Saleh模型进行观察。具体来说,在QAM调制器之后添加一个非线性模块,使调制后的波形经历AM / AM和AM / PM转换。 在Saleh模型中,转换用四个参数表示,即AM / AM转换为????a和????a,AM / PM转换为????p和????p。 在Saleh模型中,AM / AM和AM / PM方程以输入电压u的大小表示为: 式中,FAM / AM是AM / AM转换的输出电压与输入电压的关系,而FAM

太阳帅帅的博客 2080

二叉树的性质和常用操作代码集合

二叉树的性质和常用操作代码集合性质: 二叉树的性质和常用代码操作集合 性质1:在二叉树的第i层上至多有2^i-1个结点 性质2:深度为k的二叉树至多有2^k - 1个结点 性质3:对任意一棵二叉树T,若终端结点数为n0,而其度数为2的结点数为n2,则n0 = n2 + 1 满二叉树:深度为k且有2^-1个结点的树 完全二叉树:深度为k,结点数为n的二叉树,如果其结点1

Steve Wang's blog 2433

别再为电路自激发愁了:手把手教你用吸波材料搞定微波腔体谐振(附HFSS仿真设置)

本文详细解析了微波腔体谐振问题的工程解决方案,重点介绍了吸波材料的选型、安装工艺及HFSS仿真设置。通过实际案例和计算工具,帮助射频工程师有效抑制腔体自激,提升系统稳定性。特别适用于35GHz毫米波雷达等高频电路设计场景。

weixin_42662293的博客 383

企业级AI项目落地实战指南

企业级 AI 项目落地需构建“分阶段实施 + 多维度风控”的双轮驱动体系:实施端通过 POC 验证技术可行性、试点建立评估标准、规模化实现价值复制,各阶段需结合行业案例(如东阳光药、旺盈集团)提炼可复用经验;风险端则需覆盖技术(数据安全、模型稳定性)、合规(全球监管动态)、组织(人才与文化)维度,通过工具化框架(AI TRISM)与案例策略(邮储银行可解释性设计、拓斯达培训体系)实现风险可控。最终通过“场景聚焦 - 合规嵌入 - 持续优化”的循环机制,实现 AI 技术从“试点成功”到“全面价值创造”的跨越。

2509_93209761的博客 1437

《链式二叉树常用操作全解析》

本文介绍了链式二叉树的常见操作实现,包括:1. 计算节点总数(递归累加);2. 统计叶子节点数量(识别无子节点);3. 计算第k层节点数(递归降层);4. 求树深度(取左右子树最大深度+1);5. 查找指定值节点(前序遍历);6. 销毁树结构(后序遍历释放)。所有操作均采用递归实现,时间复杂度O(n),空间复杂度O(h)。测试用例验证了各功能的正确性,体现了二叉树操作的递归特性和分治思想。

2403_87212593的博客 1166

加权余量法求解偏微分方程

加权余量法(Weighted Residual Method)是一种数值方法,用于求解偏微分方程(PDEs)。其基本思想是将偏微分方程的残差(或余量)通过加权函数加权,并使加权余量在定义域上为零,从而形成一组代数方程进行求解。

leizhengshenglzs的博客 1792

二叉树的常用操作

二叉树的构建: 递归构建 层次构建 二叉树的遍历 先序遍历 后序遍历 中序遍历 深度 最大深度 (递归、层次遍历) 最小深度 (广度优先搜索) 节点统计 总节点数 叶子节点数 /* 10 6 14 0 0 12 16 8 0 0 0 0 0 3 9 20 0 0 15 7 0 0 0 0 1 2 3 4 5 6 7 0 0 0 0 0 0 0 0 0 0 */ #include <io...

君只见独不见的专栏 384

乐企增值税及附加税费预缴申报表填报能力说明文档V1.004

申报表填报,是指企业在自有业务系统中将算税结果数据按预填规则要求加工汇总后,进行申报表填报的过程。申报表填报前对纳税申报所需的前提条件进行校验。校验通过后,应用前序算税结果数据及预填规则进行纳税申报表预填,生成申报表数据。申报表数据通过申报业务规则校验后,经纳税人确认即完成申报表填报业务。

记录点滴 355

SAP CPI 和 PO 的区别

SAP CPI适合云集成轻量级的集成需求,并且由于其云架构,具有快速部署低维护高度可扩展的特点。SAP PO更适合本地系统集成复杂的集成场景和高度定制化的需求,并且对于已经有 SAP 基础设施的企业来说,PO 提供了更多的控制和灵活性。选择使用哪个平台通常取决于企业的技术架构、集成需求、预算以及对灵活性和控制的需求。如果企业主要使用 SAP 的本地系统,并且有复杂的集成需求,那么 SAP PO 是一个理想的选择。如果企业更多地依赖云应用,并希望简化集成操作,那么 SAP CPI 更加适合。

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

数据结构-二叉树常用操作集合

【代码】数据结构-二叉树常用操作集合。

qq_42973117的博客 178

万字长文,YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务

YOLOv8 yaml 文件解析 | 一文搞定 YOLOv8 分类任务,检测任务,分割任务,关键点任务

Coding... 1万+

二叉树的定义及常用操作

二叉树的结点记录当前节点的值,还有两个指针域分别指向两个子结点;而通过一个结点的指针来表示创建二叉树的根结点,通过两个指针域的遍历可以得到整棵二叉树的值//1.结构定义//节点int val;//值域//两个指针域,分别指向左右两个节点Tree表示的是树的根节点。

sin_0119的博客 775

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

IEM模型,地表粗糙度模拟

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

二叉树的常用操作(创建、先中后序递归与非递归遍历、层序遍历)

编译环境IDE:  codeblocksCompiler: GNU GCC#include #include #include #include //#include //#define _DEBUG_CODE //输出调试过程中变量的值 //#define _DEBUG_CODE_STACK //测试栈 //#define _DEBUG_CODE_QUEUE //测试队列 using namespace std; typedef struct BiTNode { //二

JarvisChu的专栏 2854

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

de风——二叉树常用操作你掌握了多少?

本文系统讲解了二叉树的核心操作,包括前序、中序、后序遍历的实现,节点统计方法,查找算法,以及通过前序数组构建二叉树和判断完全二叉树等。通过递归分治和层序队列两种核心思想,配合详细的代码示例和图解,完整展示了二叉树的基础操作流程。文章使用统一的示例二叉树贯穿始终,帮助读者直观理解每个操作的具体执行过程,最后提供了可直接运行的完整测试代码,是掌握二叉树基础知识的实用指南。

Xiao_running的博客 702

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

【数据结构】二叉树常用操作(Java实现)

文章目录二叉树二叉树的定义二叉树的实现二叉树的操作遍历先根遍历(Pre Order)中根遍历(In Order)后根遍历(Post Order)层次遍历(Level Traverse)常用操作创建清空判断是否为空求最大深度(高度)求最小深度求所有节点数求叶子节点个数求第k层节点数返回某节点的父亲节点查找节点判断两棵二叉树是否相等判断两棵二叉树是否镜像判断是否为完全二叉树翻转二叉树(镜像二叉树)判断是否是二叉查找树判断是否是平衡二叉树 二叉树 二叉树的定义 二叉树(Binary Tree) 二叉树(Binar

Slimshady的博客 1007

二叉树的常用操作函数

二叉树的常用操作函数  未完待续。。。   /*包含二叉树常用操作函数*/ /*未完待续...*/ tree *creat(tree *root) // 以一个字符串为例 构建二叉树 { if (str[cnt] == ',') // 此字符串为全局 { cnt++; // 计数的全局变量 return NULL; } root...

iQXQZX 671

C++实现二叉树的常用操作

C++实现二叉树的常用操作

qq_39100747的博客 234
上一篇: 螺旋矩阵
下一篇: 整型变量与字节数组的相互转换
oopDesigner
博客等级 码龄18年 36粉丝 10原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值