C++实现二叉树(建树,前序,中序,后序)递归和非递归实现
#include<iostream>
#include<string.h>
#include<stack>
using namespace std;
typedef struct BTree
{
int val;
struct BTree *left,*right;
}BTree;
class Tree
{
public:
BTree *create_node(int level,string pos);
void PreOrder(BTree *t); //先序遍历
void InOrder(BTree *t); //中序遍历
void PostOrder(BTree *t); //后序遍历
void NonRecursivePreOrder(BTree*t); //非递归前序遍历
void NonRecursiveInOrder(BTree*t); //非递归中序遍历
void NonRecursivePostOrder(BTree*t);//非递归后序遍历
BTree *root;
};
BTree* Tree::create_node(int level,string pos)
{
int data;
BTree *node = new BTree;
int a[]={,,,,,,,,,,,,,,,,,,};
static int t=;
cout<<"please enter data:level "<<level<<" "<<pos<<"--->值为:"<<a[t]<<endl;
data=a[t++];
if(data == )
{
return NULL;
}
node->val= data;
node->left = create_node(level+,"left");
node->right= create_node(level+,"right");
return node;
} void Tree::PreOrder(BTree *t)
{
if(t)
{
cout<<t->val<<" ";;
PreOrder(t->left);
PreOrder(t->right);
}
} void Tree::InOrder(BTree *t)
{
if(t)
{
InOrder(t->left);
cout<<t->val<<" ";;
InOrder(t->right);
}
} void Tree::PostOrder(BTree *t)
{
if(t)
{
PostOrder(t->left);
PostOrder(t->right);
cout<<t->val<<" ";
}
}
void Tree::NonRecursivePreOrder(BTree*t)
{
if(t==NULL)
return;
stack<BTree*>s;
BTree *p;
p=t;
while(p||!s.empty())
{
if(p)
{
cout<<p->val<<" ";
s.push(p);
p=p->left;
}
else{
p=s.top();
p=p->right;
s.pop();
}
}
}
void Tree::NonRecursiveInOrder(BTree*t)
{
if(t==NULL)
return;
stack<BTree*>s;
BTree*p;
p=t;
while(p||!s.empty())
{
if(p)
{
s.push(p);
p=p->left;
}
else
{
p=s.top();
cout<<p->val<<" ";
p=p->right;
s.pop();
}
}
}
void Tree::NonRecursivePostOrder(BTree*t)
{
if(t==NULL)
return;
stack<BTree*>s;
BTree*p=t;
BTree*r;
while(p||!s.empty())
{
if(p)
{
s.push(p);
p=p->left;
}
else
{
p=s.top();
if(p->right&&p->right!=r)
{
p=p->right;
s.push(p);
p=p->left;
}
else
{
cout<<p->val<<" ";
r=p;
s.pop();
p=NULL;
}
}
} } int main()
{
Tree tree;
tree.root = tree.create_node(,"root");
cout<<"Pre"<<endl;
tree.PreOrder(tree.root);
cout<<endl;
cout<<"非递归前序遍历"<<endl;
tree.NonRecursivePreOrder(tree.root);
cout<<endl;
cout<<"In"<<endl;
tree.InOrder(tree.root);
cout<<endl;
cout<<"非递归中序遍历"<<endl;
tree.NonRecursiveInOrder(tree.root);
cout<<endl;
cout<<"Post"<<endl;
tree.PostOrder(tree.root);
cout<<endl;
cout<<"非递归后序遍历"<<endl;
tree.NonRecursivePostOrder(tree.root);
return ;
}
结果:
please enter data:level root--->值为:
please enter data:level left--->值为:
please enter data:level left--->值为:
please enter data:level left--->值为:
please enter data:level left--->值为:
please enter data:level right--->值为:
please enter data:level right--->值为:
please enter data:level left--->值为:
please enter data:level right--->值为:
please enter data:level right--->值为:
please enter data:level left--->值为:
please enter data:level right--->值为:
please enter data:level right--->值为:
please enter data:level left--->值为:
please enter data:level left--->值为:
please enter data:level right--->值为:
please enter data:level right--->值为:
please enter data:level left--->值为:
please enter data:level right--->值为:
Pre 非递归前序遍历 In 非递归中序遍历 Post 非递归后序遍历
C++实现二叉树(建树,前序,中序,后序)递归和非递归实现的更多相关文章
- (原)neuq oj 1022给定二叉树的前序遍历和后序遍历确定二叉树的个数
题目描述 众所周知,遍历一棵二叉树就是按某条搜索路径巡访其中每个结点,使得每个结点均被访问一次,而且仅被访问一次.最常使用的有三种遍历的方式: 1.前序遍历:若二叉树为空,则空操作:否则先访问根结点, ...
- POJ 2255 Tree Recovery——二叉树的前序遍历、后序遍历、中序遍历规则(递归)
1.前序遍历的规则:(根左右) (1)访问根节点 (2)前序遍历左子树 (3)前序遍历右子树 对于图中二叉树,前序遍历结果:ABDECF 2.中序遍历的规则:(左根右) (1)中序遍历左子树 (2)访 ...
- 分别求二叉树前、中、后序的第k个节点
一.求二叉树的前序遍历中的第k个节点 //求先序遍历中的第k个节点的值 ; elemType preNode(BTNode *root,int k){ if(root==NULL) return ' ...
- 玩透二叉树(Binary-Tree)及前序(先序)、中序、后序【递归和非递归】遍历
基础预热: 结点的度(Degree):结点的子树个数:树的度:树的所有结点中最大的度数:叶结点(Leaf):度为0的结点:父结点(Parent):有子树的结点是其子树的根节点的父结点:子结点/孩子结点 ...
- 算法进阶面试题03——构造数组的MaxTree、最大子矩阵的大小、2017京东环形烽火台问题、介绍Morris遍历并实现前序/中序/后序
接着第二课的内容和带点第三课的内容. (回顾)准备一个栈,从大到小排列,具体参考上一课.... 构造数组的MaxTree [题目] 定义二叉树如下: public class Node{ public ...
- 给出 中序&后序 序列 建树;给出 先序&中序 序列 建树
已知 中序&后序 建立二叉树: SDUT 1489 Description 已知一棵二叉树的中序遍历和后序遍历,求二叉树的先序遍历 Input 输入数据有多组,第一行是一个整数t (t& ...
- 二叉树 遍历 先序 中序 后序 深度 广度 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- 前序+中序->后序 中序+后序->前序
前序+中序->后序 #include <bits/stdc++.h> using namespace std; struct node { char elem; node* l; n ...
- SDUT OJ 数据结构实验之二叉树八:(中序后序)求二叉树的深度
数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Probl ...
- SDUT-2804_数据结构实验之二叉树八:(中序后序)求二叉树的深度
数据结构实验之二叉树八:(中序后序)求二叉树的深度 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 已知一颗二叉树的中序 ...
随机推荐
- C#中对字符串的加密和解密
加密: /// <summary> /// 对字符串进行加密 /// </summary> /// <param name="proclaimText" ...
- 推荐一个 Java 实体映射工具 MapStruct
声明: 1.DO(业务实体对象),DTO(数据传输对象). 2.我的代码中用到了 Lombok ,不了解的可以自行了解一下,了解的忽略这条就好. 在一个成熟的工程中,尤其是现在的分布式系统中,应用与应 ...
- [NOIP1999] 提高组 洛谷P1016 旅行家的预算
题目描述 一个旅行家想驾驶汽车以最少的费用从一个城市到另一个城市(假设出发时油箱是空的).给定两个城市之间的距离D1.汽车油箱的容量C(以升为单位).每升汽油能行驶的距离D2.出发点每升汽油价格P和沿 ...
- 简述WEB项目前端脚本的一次重构历程,labJs,requireJs实践[转载]
重构前的状态: 大量的js代码混在繁多的Jsp文件中,对第三方的js库依赖也很杂乱.虽然在部分交互性较强的页面中,将js代码分离到了独立的js文件中,但是代码结构及依赖管理依然很乱.不说新人来了 ...
- Memcached Redis相关的干货
为了以后查阅方便,所以转了各位的博文,感谢各位原博主. http://www.searchtb.com/2011/05/redis-storage.html redis内存存储结构 ...
- UVA 11752 The Super Powers【超级幂】
题目链接: http://acm.hust.edu.cn/vjudge/contest/view.action?cid=111527#problem/Z 题意: 我们称一个可以由至少两个不同正整数的幂 ...
- java Map集合对比分析
1.Map:Map是所有map集合的顶级父接口,用于key/value形式的键值对,其中每一个key都映射到一个值,key不能重复. 2.TreeMap:该map将存储的键值对进行默认排序,并且还能够 ...
- 用WCF服务来动态的获取本地XML省市区文档
建立一个WCF服务. using ClassLibrary; using System; using System.Collections.Generic; using System.Linq; us ...
- 【Nginx】请求上下文
上下文与全异步web服务器的关系 请求上下文指在一个请求的处理过程中,把一些关键的信息保存下来的类似struct这样的结构体.每个http模块都可以有自己的上下文结构体,一般都是在刚开始处理请求时在内 ...
- UI 经常用法总结之--- UILabel UITextField (不断更新中)
UILabel : UIView <NSCoding> 1.创建一个UILabel对象 UILabel *label = [[UILabel alloc]initWithFrame:CGR ...