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

网页设计茶叶网站建设动易 网站顶部导航 sitefactory

网页设计茶叶网站建设,动易 网站顶部导航 sitefactory,wordpress极验,微信小程序开发视频完整教程引言: 遍历二叉树#xff1a;指按某条搜索路径巡访二叉树中每个结点#xff0c;使得每个结点均被访问一次#xff0c;而且仅被访问一次。 除了层次遍历外#xff0c;二叉树有三个重要的遍历方法#xff1a;先序遍历、中序遍历、后序遍历。 1、递归算法实现先序、中序、后…引言: 遍历二叉树指按某条搜索路径巡访二叉树中每个结点使得每个结点均被访问一次而且仅被访问一次。 除了层次遍历外二叉树有三个重要的遍历方法先序遍历、中序遍历、后序遍历。 1、递归算法实现先序、中序、后序遍历 1先序遍历 void PreOrderTraverse(BiTree T) {if(T){coutT-data;PreOrderTraverse(T-lchild);PreOrderTraverse(T-rchild);} }2中序遍历 void InOrderTraverse(BiTree T) { if(T){InOrderTraverse(T-lchild);coutT-data;InOrderTraverse(T-rchild);} } 3后序遍历 void PostOrderTraverse(BiTree T) { if(T){ PostOrderTraverse(T-lchild); PostOrderTraverse(T-rchild); coutT-data; } } 2.非递归算法实现先序、中序、后序遍历 采用非递归算法则需要利用栈来实现对二叉树的遍历 1先序遍历非递归算法 void PreOrder_non_recursion(BiTree T)//先序遍历的非递归算法 {LinkStack S;InitStack (S); BiTree p,q;pT;while(p||!StackEmpty(S)){if(p){Push(S,*p); coutp-data; //访问根节点 pp-lchild; //遍历左子树 }else{Pop(S,*q);pq-rchild; //遍历右子树 }} }2中序遍历非递归算法 void InOrder_non_recursion(BiTree T)//中序遍历的非递归算法 {LinkStack S;InitStack (S); BiTree p; BiTree q; pT;while(p||!StackEmpty(S)){if(p){Push(S,*p); pp-lchild; //遍历左子树 }else{Pop(S,*q);coutq-data; //访问根节点 pq-rchild; //遍历右子树 }} }3后序遍历非递归算法 采用非递归算法实现对二叉树的后序遍历会稍微复杂一些本算法借用了两个栈结构 void PostOrder_non_recursion(BiTree T)//后序遍历的非递归算法 {LinkStack l_S,r_S;InitStack (l_S);InitStack (r_S);BiTree p,q; pT;Push(l_S,*p);while(!StackEmpty(l_S)){Pop(l_S, *q);Push(r_S,*q);if(q-lchild){Push(l_S, *q-lchild);}if(q-rchild){Push(l_S,*q-rchild);}}while(!StackEmpty(r_S)){Pop(r_S,*q);coutq-data;} }3.完整代码 1、采用按照先序遍历的顺序建立二叉链表用‘#’表示空树。如图所示 2、先序遍历的递归与非递归算法的对比 #includeiostream #define OK 1 #define ERROR 0 #define OVERFLOW -2 using namespace std; typedef char TElemType; typedef int Status;typedef struct BiTNode{ //二叉树的存储结构TElemType data; // 数据域struct BiTNode *lchild; //左孩子指针struct BiTNode *rchild; //右孩子指针 }BiTNode, *BiTree;typedef struct StackNode { //栈的存储结构BiTNode data; //栈数据元素类型为树结点型 struct StackNode *next; } StackNode, *LinkStack;Status InitStack(LinkStack S) { //栈初始化S NULL;return OK; }Status Push(LinkStack S, BiTNode e) { //入栈LinkStack p;p new StackNode; //生成新结点if (!p) {return OVERFLOW;}p-data e; //将新结点数据域置为ep-next S; //将新结点插入栈顶S p; //修改栈顶指针为preturn OK; }Status Pop(LinkStack S, BiTNode e) { //出栈LinkStack p;if (S NULL)return ERROR; //栈空e S-data; //将栈顶元素赋给ep S; //用p临时保存栈顶元素空间以备释放S S-next; //修改栈顶指针delete p; //释放原栈顶元素的空间return OK; }bool StackEmpty(LinkStack S) { //判断是否空栈if (!S)return true;return false; }void CreateBiTree_PreOrder(BiTree T){ //以先序次序创建二叉树 char ch; cinch;if(ch#)TNULL; else{Tnew BiTNode; //生成根结点T-datach; //根结点的数据域置为chCreateBiTree_PreOrder(T-lchild);//构造左子树CreateBiTree_PreOrder(T-rchild); //构造右子树}}void PreOrder(BiTree T){ //先序遍历的递归递归算法if(T){coutT-data;PreOrder(T-lchild);PreOrder(T-rchild);} }void PreOrder_non_recursion(BiTree T)//先序遍历的非递归算法 {LinkStack S;InitStack (S); BiTree p,q;pT;while(p||!StackEmpty(S)){if(p){Push(S,*p); coutp-data; //访问根节点 pp-lchild; //遍历左子树 }else{Pop(S,*q);pq-rchild; //遍历右子树 }} }int main() {BiTree T;cout以先序次序创建二叉链表以#表示空子树endl;CreateBiTree_PreOrder(T);cout先序序列递归算法; PreOrder(T); cout\n先序序列非递归算法; PreOrder_non_recursion(T);return 0; } 实验结果 3、中序遍历的递归与非递归算法的对比 #includeiostream #define OK 1 #define ERROR 0 #define OVERFLOW -2 using namespace std; typedef char TElemType; typedef int Status;typedef struct BiTNode{ //二叉树的存储结构TElemType data; // 数据域struct BiTNode *lchild; //左孩子指针struct BiTNode *rchild; //右孩子指针 }BiTNode, *BiTree;typedef struct StackNode { //栈的存储结构BiTNode data; //栈数据元素类型为树结点型 struct StackNode *next; } StackNode, *LinkStack;Status InitStack(LinkStack S) { //栈初始化S NULL;return OK; }Status Push(LinkStack S, BiTNode e) { //入栈LinkStack p;p new StackNode; //生成新结点if (!p) {return OVERFLOW;}p-data e; //将新结点数据域置为ep-next S; //将新结点插入栈顶S p; //修改栈顶指针为preturn OK; }Status Pop(LinkStack S, BiTNode e) { //出栈LinkStack p;if (S NULL)return ERROR; //栈空e S-data; //将栈顶元素赋给ep S; //用p临时保存栈顶元素空间以备释放S S-next; //修改栈顶指针delete p; //释放原栈顶元素的空间return OK; }bool StackEmpty(LinkStack S) { //判断是否空栈if (!S)return true;return false; }void CreateBiTree_PreOrder(BiTree T){ //以先序次序创建二叉树 char ch; cinch;if(ch#)TNULL; else{Tnew BiTNode; //生成根结点T-datach; //根结点的数据域置为chCreateBiTree_PreOrder(T-lchild);//构造左子树CreateBiTree_PreOrder(T-rchild); //构造右子树}}void InOrder(BiTree T){ //中序遍历的递归递归算法if(T){InOrder(T-lchild);coutT-data;InOrder(T-rchild);} }void InOrder_non_recursion(BiTree T)//中序遍历的非递归算法 {LinkStack S;InitStack (S); BiTree p; BiTree q; pT;while(p||!StackEmpty(S)){if(p){Push(S,*p); pp-lchild; //遍历左子树 }else{Pop(S,*q);coutq-data; //访问根节点 pq-rchild; //遍历右子树 }} }int main() {BiTree T;cout以先序次序创建二叉链表以#表示空子树endl;CreateBiTree_PreOrder(T);cout中序序列递归算法; InOrder(T); cout\n中序序列非递归算法; InOrder_non_recursion(T);return 0; } 实验结果 4、后序遍历的递归与非递归算法的对比 #includeiostream #define OK 1 #define ERROR 0 #define OVERFLOW -2 using namespace std; typedef char TElemType; typedef int Status;typedef struct BiTNode{ //二叉树的存储结构TElemType data; // 数据域struct BiTNode *lchild; //左孩子指针struct BiTNode *rchild; //右孩子指针 }BiTNode, *BiTree;typedef struct StackNode { //栈的存储结构BiTNode data; //栈数据元素类型为树结点型 struct StackNode *next; } StackNode, *LinkStack;Status InitStack(LinkStack S) { //栈初始化S NULL;return OK; }Status Push(LinkStack S, BiTNode e) { //入栈LinkStack p;p new StackNode; //生成新结点if (!p) {return OVERFLOW;}p-data e; //将新结点数据域置为ep-next S; //将新结点插入栈顶S p; //修改栈顶指针为preturn OK; }Status Pop(LinkStack S, BiTNode e) { //出栈LinkStack p;if (S NULL)return ERROR; //栈空e S-data; //将栈顶元素赋给ep S; //用p临时保存栈顶元素空间以备释放S S-next; //修改栈顶指针delete p; //释放原栈顶元素的空间return OK; }bool StackEmpty(LinkStack S) { //判断是否空栈if (!S)return true;return false; }void CreateBiTree_PreOrder(BiTree T){ //以先序次序创建二叉树 char ch; cinch;if(ch#)TNULL; else{Tnew BiTNode; //生成根结点T-datach; //根结点的数据域置为chCreateBiTree_PreOrder(T-lchild);//构造左子树CreateBiTree_PreOrder(T-rchild); //构造右子树}}void PostOrder(BiTree T){ //后序遍历的递归递归算法if(T){PostOrder(T-lchild);PostOrder(T-rchild);coutT-data;} }void PostOrder_non_recursion(BiTree T)//后序遍历的非递归算法 {LinkStack l_S,r_S;InitStack (l_S);InitStack (r_S);BiTree p,q; pT;Push(l_S,*p);while(!StackEmpty(l_S)){Pop(l_S, *q);Push(r_S,*q);if(q-lchild){Push(l_S, *q-lchild);}if(q-rchild){Push(l_S,*q-rchild);}}while(!StackEmpty(r_S)){Pop(r_S,*q);coutq-data;} }int main() {BiTree T;cout以先序次序创建二叉链表以#表示空子树endl;CreateBiTree_PreOrder(T);cout后序序列递归算法; PostOrder(T); cout\n后序序列非递归算法; PostOrder_non_recursion(T);return 0; } 实验结果 4.结语 对于先序、中序和后序遍历如果采用非递归算法则需要借助栈来实现。对于二叉树而言还有一种大家更为熟知的遍历方式那就是层次遍历。实现对二叉树的层次遍历则需要借助队列来实现。实现对二叉树的层次遍历可以参考C实现二叉树的层次遍历 欢迎大家一起来交流~
http://www.dnsts.com.cn/news/224826.html

相关文章:

  • 做网站切图的原则是什么网站建设 外包
  • 南山网站建设公司wordpress打开有背景音乐
  • 网站怎么做免费推广方案免费企业名录
  • vpsputty做网站网络营销推广方案书
  • 个性化网站定制价格如何注册公司邮箱帐号
  • 哪个网站做电商门槛最低wordpress个人博客前台模板下载
  • 做个购物网站设计店名logo
  • 长沙竞价网站建设报价国外网站建设官网
  • 模板网站 seowordpress企业模板下载
  • 网站监控怎么做app优化是什么意思
  • 学科主题资源网站的建设河北网站seo优化
  • 伪原创嵌入网站摄影网站的市场可行性
  • 网站开发中为什么有两个控制层网站建设相关关键词
  • 哈尔滨cms模板建站网站301重定向 权重转移
  • 云南省住房和建设厅网站电商网站建设好么
  • 网站动态效果用什么软件做的wordpress图片主题模板
  • 珠海建设局网站首页wordpress页底白
  • 天津网站建设信息科技有限公司设计师常用网站门户
  • 婺城区建设局网站天津新亚太工程建设监理有限公司网站
  • 湖北工程建设信息网站盘锦949公社最新招聘
  • 济宁做网站哪家比较好网站源码地址怎么看
  • 上海大型网站设计公司天津建设工程新希望
  • 北京专业网站翻译影音字幕翻译速记速记快而高效中山免费网站建设
  • wordpress比织梦好北京seo排名分析
  • 做社交网站 投入本钢建设公司官网
  • 济南网站建设培训软件代做公司
  • 实惠高端网站设计品牌wordpress头像存储
  • 旅游网站开发团队网络推广软文是一种很好的推广方式
  • 寺院的网站怎么做软件开发过程模型
  • 摄影师个人网站模板建设网上银行查询