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 已知一颗二叉树的中序 ...
随机推荐
- 自用的博客皮肤CSS代码
是在默认皮肤simple memory的基础上进行的魔改 /*****home和头部开始**************************/ #home { margin: 0 auto; widt ...
- 介绍 JSON的
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. 易于人阅读和编写.同时也易于机器解析和生成. 它基于JavaScript Programming Lan ...
- Codeforces 653A Bear and Three Balls【水题】
题目链接: http://codeforces.com/problemset/problem/653/A 题意: 给定序列,找是否存在连续的三个数. 分析: 排序~去重~直接判断~~ 代码: #inc ...
- java序列化,看这篇就够了
一.序列化的含义.意义及使用场景二.序列化实现的方式1.Serializable1.1 普通序列化1.2 成员是引用的序列化1.3 同一对象序列化多次的机制1.4 java序列化算法潜在的问题1.5 ...
- 关于Chrome谷歌浏览器开发者工具网络Network中返回无数据的问题
1.如图所示,对于有些js文件,响应中无返回数据,Failed to load response data,当然本来是应该有数据,你用火狐浏览器看,就是有的,或者直接在浏览器地址栏里输入url,也可以 ...
- Android中传递对象的三种方法
Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! Android中,Activity和Fragment之间传递对象,可以通过将对象序列化并存入Bundle或者I ...
- 【c++】面向对象程序设计之继承中的类作用域
当存在继承关系时,派生类的作用域嵌套在其基类的作用域之内. 一个对象.引用或指针的静态类型决定了该对象的哪些成员是可见的.即使静态类型与动态类型可能不一致,但我们使用哪些成员仍然是由静态类型决定的.基 ...
- 【转】面向切面编程-AOP,挺有用的
原文:http://blog.csdn.net/yangzhihello/article/details/40377399 下面的代码有点问题, ins[methodName] = function( ...
- Scala入门到精通——第二十四节 高级类型 (三)
作者:摆摆少年梦 视频地址:http://blog.csdn.net/wsscy2004/article/details/38440247 本节主要内容 Type Specialization Man ...
- Eclipse配置中文(汉化)
1.首先打开网址:http://www.eclipse.org/babel/downloads.php 然后查看安装以及版本选择 关于安装存储库,去这里查看 我选的是最新的版本:oxygen 未FQ请 ...