二叉树,建树,前序,中序,后序,递归 非递归
二叉树遍历:
#include <iostream> #include <vector> #include <string> #include <sstream> #include<stack> #include<queue> using namespace std; struct BiTreeNode {char data;struct BiTreeNode *left_child;struct BiTreeNode *right_child; };int N = 0;void CreateBiTree(BiTreeNode* &T,char array[]){ //按先序输入二叉树中结点的值(一个字符),空格字符代表空树, //构造二叉树表表示二叉树T。 char ch = array[N];N = N + 1; if(ch =='*') T=NULL;//其中getchar()为逐个读入标准库函数 else{ T=new BiTreeNode;//产生新的子树 T->data=ch;//由getchar()逐个读入来 CreateBiTree(T->left_child,array);//递归创建左子树 CreateBiTree(T->right_child,array);//递归创建右子树 } }//CreateTree void create_T(BiTreeNode* &T, char array[]) {char ch = array[N];N=N+1;if (ch == '*') {T = NULL;} else {T = new BiTreeNode;T->data = ch;create_T(T->left_child, array);create_T(T->right_child, array);} }// 递归 先序遍历 void pre_order_traverse(BiTreeNode* &T) {// 先序遍历if (T) {cout << T->data << " ";pre_order_traverse(T->left_child);pre_order_traverse(T->right_child);} }//先序遍历 非递归; void pre_order_traverse_no_recurse(BiTreeNode* &T) {// 非递归先序遍历二叉树stack<BiTreeNode*> s;BiTreeNode *p = T;// 当栈非空或者p指针非空时调用循环while (p != nullptr || !s.empty()) {while ( p != nullptr) {cout << p->data << " ";s.push(p);p = p->left_child;}if (!s.empty()) {p = s.top();s.pop();p = p->right_child;}} }// 递归 中序遍历 void in_order_traverse(BiTreeNode* &T) {// 中序遍历if (T) {in_order_traverse(T->left_child);cout << T->data << " ";in_order_traverse(T->right_child);} }// 中序遍历 非递归 void in_order_traverse_no_recurse(BiTreeNode* &T) {stack<BiTreeNode*> s;BiTreeNode *p = T;while (p != nullptr || !s.empty()) {while ( p != nullptr) {s.push(p);p = p->left_child;}if (!s.empty()) {p = s.top();cout << p->data << " ";s.pop();p = p->right_child;}} }// 递归 后序遍历 void pos_order_traverse(BiTreeNode* &T) {// 中序遍历if (T) {pos_order_traverse(T->left_child);pos_order_traverse(T->right_child);cout << T->data << " ";} }// 后序遍历 非递归 void pos_order_traverse_no_recurse(BiTreeNode* &T) {stack<BiTreeNode*> s;BiTreeNode *p = T;BiTreeNode*pp = NULL;while (p != nullptr || !s.empty()) {while ( p != nullptr) {s.push(p);p = p->left_child;}if (!s.empty()) {p = s.top();if(p->right_child==NULL || p->right_child == pp){cout<<p->data<<" ";s.pop();pp = p;p = NULL;}else{p=p->right_child;}}} }void BFS(BiTreeNode* &T) {queue<BiTreeNode*>s;BiTreeNode *p = T;s.push(T);while(!s.empty()){p = s.front();s.pop();cout<<p->data<<" ";if(p->left_child){s.push(p->left_child);}if(p->right_child){s.push(p->right_child);}}}int main(){ char array[]= "abce***d**mn*k**o*jh***"; BiTreeNode*T; // create_T(T,array); CreateBiTree(T,array);//pre_order cout<<"pre_order_traverse"<<endl; pre_order_traverse(T); cout<<endl; cout<<"pre_order_traverse_no_recurse"<<endl; pre_order_traverse_no_recurse(T); cout<<endl;//in_order cout<<"in_order_traverse"<<endl; in_order_traverse(T); cout<<endl; cout<<"in_order_traverse_no_recurse"<<endl; in_order_traverse_no_recurse(T); cout<<endl;//pos_order cout<<"pos_order_traverse"<<endl; pos_order_traverse(T); cout<<endl; cout<<"pos_order_traverse_no_recurse"<<endl; pos_order_traverse_no_recurse(T); cout<<endl;//层次遍历 BFS(T);return 0; }
转载于:https://www.cnblogs.com/lovychen/p/11329117.html
二叉树,建树,前序,中序,后序,递归 非递归相关推荐
- java中二叉树_Java工程师面试1000题224-递归非递归实现二叉树前、中、后序遍历...
224.使用递归和非递归实现二叉树的前.中.后序遍历 使用递归来实现二叉树的前.中.后序遍历比较简单,直接给出代码,我们重点讨论非递归的实现. class Node { public int valu ...
- C++实现二叉树 前、中、后序遍历(递归与非递归)非递归实现过程最简洁版本
本文并非我所写,是复制的该链接中的内容: 最近学习二叉树,想编程实现递归和非递归的实现方式: 递归的方式就不说了,因为大家的递归程序都一样:但是对于非递归的实现方式, 根据这几天的查阅资料已看到差不多 ...
- 【LeetCode | 二叉树前、中、后序遍历{递归法}实现】
1.前序遍历 #include <iostream> #include <vector> #include <queue> #include <algorit ...
- 【LeetCode | 二叉树前、中、后序遍历{迭代法}实现】
1.前序遍历 // 解题思路:利用栈的原理实现以迭代方法来前序遍历(根左右)二叉树 class Solution { public:vector<int> preorderTraversa ...
- java数据结构学习笔记-二叉树前、中、后序遍历
public class BinaryTreeDemo {public static void main(String args[]){Employee emp1= new Employee(1,&q ...
- 二叉树前、中、后序线索化及遍历
public class ThreadedBinaryTree {public static void main(String[] args){Heronodes node1=new Heronode ...
- 二叉树的前、中、后、层次非递归遍历(js)
有如下二叉树 遍历: // 前序遍历, head-left-rightfunction HLR (tree) {const stack = [], res = []if (tree) stack.p ...
- 二叉树根据前序遍历和后序遍历,求解中序遍历
既然是树,还是用根来描述更为贴切,先把根遍历出来,再遍历左右子树,就是先根遍历:后根遍历就是先把左右子树遍历出来,再把根遍历出来:只要牢记一点,不论怎么遍历,规则同样要作用于子树. 比如上图,先根遍历 ...
- 二叉树前序中序后序javascript_C++实现二叉树(建树,前序,中序,后序)递归和非递归实现...
#include#include#include using namespacestd; typedefstructBTree {intval;struct BTree *left,*right; } ...
- 【二叉树Java】二叉树遍历前序中序后序遍历的非递归写法
本文主要介绍二叉树前序中序后序遍历的非递归写法 在探讨如何写出二叉树的前序中序后序遍历代码之前,我们先来明确一个问题,前序中序后序遍历根据什么区分? 二叉树的前序中序后序遍历,是相较根节点说的.最先遍 ...
最新文章
- android 按键kl文件,Android添加新按键
- Python 处理CSV文件
- 刚体Collider包围测试
- TMS320F28335的SCI通信-FIFO中断通信实验
- having and group by
- DDG全家桶之3022
- 广州技术沙龙第 2、3 期参会者twitter、blog、兴趣大合集
- JavaScript从入门到放弃-JavaScript历史介绍
- 随想录(学校研究和公司研发)
- 拓端tecdat|R语言:用R语言填补缺失的数据
- Atitit jquery 1.4--v1.11 v1.12 v2.0 3.0 的新特性
- 《游戏设计、原型与开发——基于Unity与C#从构思到实现》学习笔记一
- 牛顿插值法的Python程序
- 基于51单片机的四通道交通灯设计
- 华为路由交换设备命令集合,建议收藏!
- 猜数字游戏,用户充值版(Java)
- 《魔兽世界插件》教程—21点扑克游戏 Blackjack
- 华为:证实已开发出自主操作系统
- 球球音响机器人怎么合成的_PS合成机器人教程
- sideeffects没配置css也还在,webpack4踩坑配置之sideEffects, 打包文件中没有css文件
热门文章
- Adobe Acrobat Pro设置高亮快捷键
- 本科主要数学科目的页数统计
- intellij默认maven仓库配置路径+默认New Project 工程路径
- ZooKeeper available but no active master location found
- synaptic不停抖动后自动关闭的问题
- ./configure: error: SSL modules require the OpenSSL library.
- mariadb设置root初始密码
- ubuntu: ssh: connect to host ubuntu port 22: No route to host
- is not allowed to connect to this MySql
- jquery中如何表达本页网址_jquery中怎么跳转页面?