首先定义二叉树的节点

struct BTNode
{int data;BTNode *left;BTNode *right;
};

然后先序建立二叉树

思路:以数组中的元素先序构建二叉树,过程就是不断插入,直至数组中没有元素

//先序建立二叉树
void insert_node(BTNode **root, int *data, int i)
{if(i<=data[0]){*root = new BTNode();(*root)->data = data[i];(*root)->left=NULL;(*root)->right=NULL;insert_node(&((*root)->left), data, 2*i);insert_node(&((*root)->right), data, 2*i+1);}
}

再进行遍历二叉树的操作,先序,中序,后续,以及层序遍历

//递归实现二叉树的遍历
void pre_order(BTNode *root)
{if(root!=NULL){cout << root->data << " ";pre_order(root->left);pre_order(root->right);}
}void in_order(BTNode *root)
{if(root!=NULL){in_order(root->left);cout << root->data << " ";in_order(root->right);}
}void post_order(BTNode *root)
{if(root!=NULL){post_order(root->left);post_order(root->right);cout << root->data << " ";}
}
//
// 非递归实现二叉树的遍历
// 先将根节点值输出,再压入栈,接着访问根节点的左孩子
// 若左孩子非空,则输出值,压栈,若空则弹栈,访问右孩子
// 重复上述步骤,直至树所有节点访问为止
/void non_pre_order(BTNode *root)
{stack<BTNode *>s;while(s.size() || root!=NULL){if(root!=NULL){cout << root->data << " ";s.push(root);root = root->left;}else{ root = s.top();s.pop();root = root->right;} }
}//
// 非递归实现中序二叉树
// 先访问二叉树的根节点,并且压栈,接着访问树的左孩子,若左孩子非空
// 则继续访问该孩子的左孩子,若空,则弹出节点,并输出该节点的值,
// 并继续该孩子的右孩子,直到访问完二叉树的全部节点
/
void non_in_order(BTNode *root)
{stack<BTNode *> s;while(s.size() || root!=NULL){if(root!=NULL){s.push(root);root = root->left;}else{root = s.top();s.pop();cout << root->data << " ";root = root->right;}}
}/
// 非递归实现后序遍历二叉树
// 先将根节点入栈,再判断栈顶元素是否被访问过
// 若未被访问,则依次将栈顶元素的右孩子,左孩子入栈
// 重复上述步骤,知道栈空为止void non_post_order(BTNode *root)
{stack<BTNode *> s;BTNode *cur=NULL;     //当前访问的结点BTNode  *pre=NULL;    //前一个访问的结点s.push(root);while(s.size() && root!=NULL){cur = s.top();if((cur->left==NULL&&cur->right==NULL)|| (pre!=NULL&&(pre==cur->left||pre==cur->right))){cout << cur->data << " ";s.pop();pre = cur;}else{if(cur->right!=NULL)s.push(cur->right);if(cur->left!=NULL)s.push(cur->left);}}
}///
// 层序遍历二叉树
//
void floor_order(BTNode *root)
{queue<BTNode *> q;BTNode *cur;q.push(root);while(root!=NULL && q.size()){cur = q.front();cout << cur->data << " ";    q.pop();if(cur->left!=NULL)q.push(cur->left);if(cur->right!=NULL)q.push(cur->right);}
}

下面是测试代码:

int main(void)
{int i=0, input;int data[]={5, 1, 2, 3, 4, 5};BTNode *root = NULL;insert_node(&root, data, 1);//先序遍历二叉树cout << "递归先序遍历二叉树" << endl;pre_order(root);cout << "\n非递归先序遍历二叉树\n";non_pre_order(root);cout << "\n递归中序遍历二叉树\n";//中序遍历二叉树in_order(root);cout << "\n非递归中序遍历二叉树\n";non_in_order(root);cout << "\n递归后序遍历二叉树\n";//后序遍历二叉树post_order(root);cout << "\n非递归后序遍历二叉树\n";non_post_order(root);cout << endl;//层序遍历二叉树cout << "层序遍历二叉树\n";floor_order(root); cout << endl;return 0;
}

有什么不对,可以指出,共同学习,共同进步!

转载于:https://www.cnblogs.com/jiangu66/p/3202721.html

有关二叉树的相关实现:建树,遍历(递归与非递归实现)相关推荐

  1. 二叉树的先中后序递归和非递归遍历(数据结构作业)

    一.设计思想 我创建二叉树是用的先序创建,其中用'#'代表空节点. 1.递归先序遍历 (1)如果当前节点为空节点(用'#'代表空节点),结束当前函数 (2)打印当前节点 (2)递归当前节点的左子树 ( ...

  2. C语言实现二叉树前序中序后序递归与非递归遍历、层次遍历、二叉树带权路径长度

    用C语言实现了二叉树的初始化,循环队列与顺序栈的建立. 利用递归与非递归方式实现前序遍历.中序遍历.后序遍历. 利用队列实现了层次遍历. 求得了二叉树带权路径长度 #include<stdio. ...

  3. 二叉树的几种递归和非递归式遍历:

    二叉树的几种递归和非递归式遍历: 1 #include <fstream> 2 #include <iostream> 3 4 using namespace std; 5 6 ...

  4. 转载:二叉树的前中后和层序遍历详细图解(递归和非递归写法)

    二叉树的前中后和层序遍历详细图解(递归和非递归写法) Monster_ii 2018-08-27 17:01:53 50530 收藏 403 分类专栏: 数据结构拾遗 文章标签: 二叉树 前序 中序 ...

  5. 二叉树的遍历:先序 中序 后序遍历的递归与非递归实现及层序遍历

    二叉树的定义:一种基本的数据结构,是一种每个节点的儿子数目都不多于2的树 树节点的定义如下: // 树(节点)定义 struct TreeNode {int data; // 值TreeNode* l ...

  6. 二叉树的三种遍历方式(递归、非递归和Morris遍历)

    二叉树的三种遍历方式(递归.非递归和Morris遍历) 原文:http://www.linuxidc.com/Linux/2015-08/122480.htm 二叉树遍历是二叉树的最基本的操作,其实现 ...

  7. 二叉树的前序、中序、后序遍历(递归、非递归写法)

    文章目录 一.什么是二叉树? 二.二叉树的基本概念 三.二叉树的三种遍历方式 1.前序遍历(preordertraversal) 1.中序遍历(inordertraversal) 1.后序遍历(pos ...

  8. 二叉树的非递归遍历(递归和非递归)

    二 叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是 递归定义,因此采用递归的方法去实现树的三种遍历不仅 ...

  9. 分别用递归和非递归方式实现二叉树先序、中序和后序遍历(java实现)

    分别用递归和非递归方式实现二叉树先序.中序和后序遍历 用递归和非递归方式,分别按照二叉树先序.中序和后序打印所有的节点.我们约定:先序遍历顺序 为根.左.右;中序遍历顺序为左.根.右;后序遍历顺序为左 ...

  10. 二叉树的递归和非递归遍历

    二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...

最新文章

  1. DeepMind科学家:AI对战《星际争霸》胜算几何?
  2. 他是20世纪最伟大的发明家之一,却因竞争对手迫害,郁郁而终
  3. Android10.0 Binder通信原理(五)-Binder驱动分析
  4. 图解数据中心水系统标准和架构(大全)
  5. 已知圆心 坐标和一点坐标和角度 就之后的坐标_《6. AutoCAD 标注角度尺寸》
  6. 通过Serverless技术降低微服务应用资源成本
  7. linux驱动头文件查找目录,在Fedora 20中查找简单设备驱动程序的头文件
  8. WEB安全基础-CSRF漏洞
  9. 电脑文件夹加密软件_上海靠谱电脑资料加密软件解决方案
  10. 全国各地区域码 --- (当地身份证号前六位)
  11. 华南技术盛会:BingoDay2017今在天河人才港盛大举行
  12. 本地项目上传到码云gitee
  13. Redis队列和专业MQ的对比和选型
  14. Redis设置登录密码
  15. SIP协议详解(中文)-6
  16. 深入产品线的配置管理
  17. NeoVim/SpaceVim初体验
  18. iOS开发中一些有用的小代码
  19. Java毕设项目:智慧校园管理系统
  20. java类编来那个初始化顺序_java类的初始化顺序

热门文章

  1. 宛如造句,小学生怎么用宛如造句?
  2. 实体店想多赚钱就要学会互联网思维
  3. 83年的我刚好今年遇到了失业
  4. 新模式卖保健品,怎么做到年入5百万?
  5. The authors of these two monitoring tools
  6. Qt——P9 信号和槽
  7. python入门——P42魔法方法:算数运算1
  8. JavaScript中的流程控制语句
  9. Java常量设计与常量池
  10. Android数据存储——SharedPreferences