先序建立二叉树、非递归实现先序遍历和中序遍历、队列实现层次遍历

先序建立二叉树,#表示空结点。
使用栈,实现非递归先序遍历和中序遍历。
使用队列实现层次遍历。

直接上代码,寒假完善注释,甚至从头到尾把《数据结构与算法》的相关代码写一遍。

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<iostream>
using namespace std;typedef char DataType;#define MAXSIZE 100typedef struct node
{DataType data;struct node *lchild;struct node *rchild;
}BiTreeNode,*BiTree;//先序建立二叉树
void CreateBiTree(BiTree &root)
{char c;cin>>c;if(c=='#'){root=NULL;}else{root=(BiTree)malloc(sizeof(BiTreeNode));root->data=c;CreateBiTree(root->lchild);CreateBiTree(root->rchild);}
}//递归实现先序遍历
void PreOrder(BiTree root)
{if(root!=NULL){cout<<root->data<<" ";PreOrder(root->lchild);PreOrder(root->rchild);}
}//递归实现中序遍历
void InOrder(BiTree root)
{if(root!=NULL){InOrder(root->lchild);cout<<root->data<<" ";InOrder(root->rchild);}
}//递归实现后序遍历
void PostOrder(BiTree root)
{if(root!=NULL){PostOrder(root->lchild);PostOrder(root->rchild);cout<<root->data<<" ";}
}//非递归实现先序遍历
void NonPreOrder(BiTree root)
{BiTree S[MAXSIZE];BiTree p;int top=-1;S[++top]=root;while(top!=-1){p=S[top--];cout<<p->data<<" ";if(p->rchild!=NULL) S[++top]=p->rchild;if(p->lchild!=NULL) S[++top]=p->lchild;}
}//非递归实现中序遍历
void NonInOrder(BiTree root)
{BiTree S[MAXSIZE];BiTree p=root;int top=-1;while(top!=-1 || p!=NULL){while(p!=NULL){S[++top]=p;p=p->lchild;}if(top!=-1){p=S[top--];cout<<p->data<<" ";p=p->rchild;}}
}//队列实现层次遍历
void LevelOrder(BiTree root)
{BiTree Queue[MAXSIZE];int front=-1;int rear=0;Queue[rear]=root;while(rear!=front){cout<<Queue[++front]->data<<" ";if(Queue[front]->lchild) Queue[++rear]=Queue[front]->lchild;if(Queue[front]->rchild) Queue[++rear]=Queue[front]->rchild;}
}//求二叉树的深度
int Depth(BiTree root)
{if(root==NULL) return 0;else return max(Depth(root->lchild),Depth(root->rchild))+1;
}int max(int a,int b)
{if(a>b) return a;else return b;
}//求叶子结点的数量
int LeafCount(BiTree root)
{if(root==NULL) return 0;if(root->lchild==NULL && root->rchild==NULL) return 1;return LeafCount(root->lchild)+LeafCount(root->rchild);
}//求度为1的结点的数量
int DegreeOneCount(BiTree root)
{if(root==NULL) return 0;if((root->lchild!=NULL && root->rchild==NULL) || (root->lchild==NULL && root->rchild!=NULL))return DegreeOneCount(root->lchild)+DegreeOneCount(root->rchild)+1;return DegreeOneCount(root->lchild)+DegreeOneCount(root->rchild);
}//求度为2的结点的数量
int DegreeTwoCount(BiTree root)
{if(root==NULL) return 0;if(root->lchild!=NULL && root->rchild!=NULL) return DegreeTwoCount(root->lchild)+DegreeTwoCount(root->rchild)+1;return DegreeTwoCount(root->lchild)+DegreeTwoCount(root->rchild);
}//测试序列:ABD##E##CF###
int main()
{BiTree root;CreateBiTree(root);cout<<"二叉树的深度: "<<Depth(root)<<endl;cout<<"二叉树的叶子结点数: "<<LeafCount(root)<<endl;cout<<"度为1的结点数: "<<DegreeOneCount(root)<<endl;cout<<"度为2的结点数: "<<DegreeTwoCount(root)<<endl;cout<<"递归先序遍历: ";PreOrder(root);cout<<endl;cout<<"非递归先序遍历: ";NonPreOrder(root);cout<<endl;cout<<"递归中序遍历: ";InOrder(root);cout<<endl;cout<<"非递归中序遍历: ";NonInOrder(root);cout<<endl;cout<<"递归后序遍历: ";PostOrder(root);cout<<endl;cout<<"层次遍历: ";LevelOrder(root);cout<<endl;system("pause");return 0;
}

非递归实现先序遍历和中序遍历相关推荐

  1. 非递归实现二叉树的前序、中序、后序遍历

    目录 非递归实现二叉树的前序遍历 非递归实现二叉树的中序遍历 非递归实现二叉树的后序遍历 根据二叉树的前序和中序遍历结果还原二叉树 根据二叉树的中序和后序遍历结果还原二叉树 非递归遍历需要借助栈. 非 ...

  2. 非递归,不用栈实现二叉树中序遍历

    最近总有人问这个问题:"如何不用栈,也不用递归来实现二叉树的中序遍历".这个问题的实现就是迭代器问题,无论是Java还是C++,利用迭代器遍历树节点(Java中是TreeMap类, ...

  3. 非递归实现二叉树(前序,中序,后序)c/c++实现

    这里还是用到栈的思想,为了方便用了c++的一些内容,把出栈,进栈,读栈顶元素用一个个函数封装起来了,前面做了一些处理来使用这些函数. 前序非递归 思想:一直走左边,依次进栈.等左边为空的时候,返回,也 ...

  4. 二叉树先序遍历、中序遍历、后序遍历 递归和非递归算法

    一.二叉树先序遍历 (1)递归算法 // 递归先序遍历 public static void recursionPreorderTraversal(TreeNode root) {if (root ! ...

  5. 【数据结构笔记10】二叉树的先序、中序、后序遍历,中序遍历的堆栈/非递归遍历算法,层序遍历,确定一个二叉树,树的同构

    本次笔记内容: 3.3.1 先序中序后序遍历 3.3.2 中序非递归遍历 3.3.3 层序遍历 3.3.4 遍历应用例子 小白专场:题意理解及二叉树表示 小白专场:程序框架.建树及同构判别 文章目录 ...

  6. 二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现

    二叉树,二叉树的归先序遍历,中序遍历,后序遍历,递归和非递归实现 提示:今天开始,系列二叉树的重磅基础知识和大厂高频面试题就要出炉了,咱们慢慢捋清楚! 文章目录 二叉树,二叉树的归先序遍历,中序遍历, ...

  7. 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法

    本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...

  8. JavaScript(JS)前序遍历,中序遍历,后序遍历,层序遍历,图文详解两种(递归与迭代)实现的方式

    1.二叉树的前序遍历 前序遍历首先访问根结点然后遍历左子树,最后遍历右子树. 在遍历左.右子树时,仍然先访问根结点,然后遍历左子树,最后遍历右子树. 若二叉树为空则结束返回,否则: (1)访问根结点. ...

  9. python实现二叉树遍历(前序遍历、中序遍历、后序遍历)

    python实现二叉树遍历(前序遍历.中序遍历.后序遍历) 在计算机科学中,二叉树是一种树数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点.使用集合理论概念的递归定义是(非空)二叉树是元 ...

最新文章

  1. Can't load IA 32-bit .dll on a AMD 64-bit platform
  2. django1.4.5配置静态文件(img,css,js)访问
  3. VSCode切换默认终端为cmd
  4. pl/sql链接64位oracle数据库报错Could not initialize oci.dll
  5. 微信终端跨平台组件 mars 系列(二) - 信令传输超时设计
  6. 程序员数学基础【三、取模运算(取余运算功能重叠部分)】(Python版本)
  7. mysql order by 运算_在MySQL中具有ORDER BY的多个LIKE运算符?
  8. AT4120-[ARC096D]Sweet Alchemy【贪心,背包】
  9. fibonacci数列的题目——剑指Offer
  10. 1051 mysql 主从_mysql配置主从读写分离的一些想法
  11. CCCC-GPLT L1-034. 点赞 团体程序设计天梯赛
  12. python 的内置方法zip()介绍
  13. iOS开发字符串倒序,倒序单词字母,不倒序单词位置
  14. 无人机——凤凰模拟器篇(五)遥控器的配置教程
  15. ANSYS ICEM CFD——网格划分基础知识
  16. Android 系统(44)---多语言
  17. ADS1115的IIC通信
  18. ecu故障现象_分析及检修汽车ECU常见故障
  19. 设置input框只能输入数字或者只能输入英文
  20. c语言零错误零警告,C语言 g警告:无符号表达式的比较0始终为false

热门文章

  1. 安装Adobe XD出错
  2. 【仿旅游网站】使用Promise改造封装好的Ajax
  3. KGB SFX 脱壳
  4. 京东英特尔联手布局企业级市场,引领中小企业PC采购新趋势
  5. JDK8的安装及win10配置JDK8的环境变量
  6. 下载docker-compose太慢解决方式
  7. Android Camera HDR 拍照模式的原理
  8. 首信易支付与水滴汇聚基金会战略合作项目一期上线
  9. 训练营感想_为什么训练营很有价值
  10. 商城模板网站html5手机端_玩转手机网站建设,选择模板还是不选择模板呢?