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

7. 数据结构—二叉树(链式存储)

1. 内容

包括链式存储二叉树的 递归与非递归实现的先序、中序以及后序遍历、层序遍历、创建二叉树、计算深度、总节点数。

2. 实现代码

注意:只是伪代码,如果想要运行的话在细节方面需要自己修正,栈和队列的方法实现需要引进或者使用其C++自带的功能函数。

#include<bits/stdc++.h>
using namespace std;typedef char ElemType;typedef struct BiTNode{ElemType data;       //数据域 struct BiTNode *lchild,*rchild;  //左右孩子指针 
}BiTNode,  *BiTree;//1. 先序遍历(根左右)->递归实现 
void PreOrderTraverse(BiTree T){if(T){cout<<T->data;PreOrderTraverse(T->lchild);PreOrderTraverse(T->rchild);} 
}// 先序遍历(根左右)-> 栈实现
void PreOrderTraverse(BiTree T){BiTree p=T;  //指向当前访问数的位置InitStack(S);  //存储根,便于回溯while(p||!StackEmpty(S)){if(p){cout<<p->data;Push(S,p);p=p->lchild;}else{   //需要将p指针进行回溯 Pop(S,p);p=p->rchild; } } 
} //2.中序遍历(左根右)->递归实现 
void InOrderTraverse(BiTree T){if(T){InOrderTraverse(T->lchild);cout<<T->data;InOrderTraverse(T->rchild);} 
}//中序遍历(左根右)->栈实现
//思路:找到最左边的节点输出之后,通过栈找到最近的根,修改指针回溯 
void InOrderTraverse(BiTree T){InitStack(S);   //初始化栈S,用于记录最近的根,便于回溯BiTree p=T;     //记录遍历位置while(p||!StackEmpty(S)){if(p){    //找到最左边的节点 Push(S,p);p=p->lchild;}else{       Pop(S,p);cout<<p->data;   //输出最左边节点的值p=p->rchild;     //实现回溯 }} 
}//3.后序遍历(左右根)->递归实现 
//使用栈实现和前面先中序逻辑差不多,但是必须得左子树和右子树访问完了之后才能访问根,更麻烦(有时间再写) 
void PostOrderTraverse(BiTree T){if(T){PostOrderTraverse(T->lchild);PostOrderTraverse(T->rchild);cout<<T->data;}
}//4.层序遍历(使用队列)
void LevelOrderTraverse(BiTree T){BiTree p;InitQueue(Q);EnQueue(Q,T);while(!QueueEmpty(Q)){DeQueue(Q,p);cout<<p->data;if(p->lchild!=NULL)EnQueue(p->lchild);if(p->rchild!=NULL)EnQueue(p->rchild);}
}//5. 使用先序遍历创建二叉树(不存在左右子树需要输入#表示) 
//其余遍历只需将位置改变一下即可,不再赘述 
void CreateBiTree(BiTree &T){char ch;cin>>ch;if(ch=='#')T=NULL;else{T=new BiTNode;T->data=ch;CreateBiTree(T->lchild);CreateBiTree(T->rchild);}
} //6.计算二叉树的深度
//递归左子树和右子树的深度,选择最大的+1即可
int Depth(BiTree T){if(T==NULL) return 0;int m=Depth(T->lchild);int n=Depth(T->rchild);return max(m,n)+1;
} //7.统计二叉树节点的个数
int NodeCount(BiTree T){if(T==NULL) return 0;return NodeCount(T->lchild)+NodeCount(T->rchild)+1;
} 

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 改编版猜数字小游戏,猜错了就黑屏(整蛊版本)
  • PhotoZoom Pro 9:AI加持让图像放大革命性飞跃 PhotoZoom下载
  • mkv怎么转换mp4格式?格式转换秘籍大揭底!
  • 《黑神话:悟空》发售后快手游戏笔记本电脑GMV日环比增长40%
  • haproxy编译安装
  • 闲置物品交易平台网站商城-计算机毕设Java|springboot实战项目
  • 泛微eteams OA对接金蝶云星空写入数据
  • 火语言RPA流程组件介绍--打开文件/运行进程命令
  • 通过Qt Creator Plugin开发Qt Creator插件-【金丹篇】
  • 视频项目开发,EasyCVR视频融合平台为何成为关键驱动力
  • jenkins最佳实践(一):jenkins安装与部署
  • SAP 界面小技巧-快速查找单据及路径
  • 机械学习—零基础学习日志(如何理解概率论5)
  • 二分查找理解
  • 喜讯!30篇论文完成知网(CNKI)检索,历时不到2个月
  • 【comparator, comparable】小总结
  • 【RocksDB】TransactionDB源码分析
  • EOS是什么
  • extjs4学习之配置
  • Java 11 发布计划来了,已确定 3个 新特性!!
  • javascript从右向左截取指定位数字符的3种方法
  • Netty 4.1 源代码学习:线程模型
  • PAT A1120
  • python_bomb----数据类型总结
  • Spring框架之我见(三)——IOC、AOP
  • Web标准制定过程
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • python最赚钱的4个方向,你最心动的是哪个?
  • ######## golang各章节终篇索引 ########
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #Linux(权限管理)
  • #Z0458. 树的中心2
  • (4)事件处理——(2)在页面加载的时候执行任务(Performing tasks on page load)...
  • (6) 深入探索Python-Pandas库的核心数据结构:DataFrame全面解析
  • (BFS)hdoj2377-Bus Pass
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (Redis使用系列) Springboot 整合Redisson 实现分布式锁 七
  • (待修改)PyG安装步骤
  • (二)pulsar安装在独立的docker中,python测试
  • (二)正点原子I.MX6ULL u-boot移植
  • (原)记一次CentOS7 磁盘空间大小异常的解决过程
  • **Java有哪些悲观锁的实现_乐观锁、悲观锁、Redis分布式锁和Zookeeper分布式锁的实现以及流程原理...
  • ??javascript里的变量问题
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @RequestMapping用法详解
  • @zabbix数据库历史与趋势数据占用优化(mysql存储查询)
  • [ C++ ] STL---string类的使用指南
  • [AI Google] 使用 Gemini 取得更多成就:试用 1.5 Pro 和更多智能功能
  • [AIGC] 如何建立和优化你的工作流?
  • [Algorithm][动态规划][子序列问题][最长递增子序列][摆动序列]详细讲解
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [C/C++]数据结构 循环队列