#include <iostream>
#include <cstdio>
#include <stdio.h>
#include <string>
#include <queue>
#include <stack>
using namespace std; class Node{
public :
char data;
struct Node *lchild,*rchild;
}; class BiTree{
public:
Node * root;//头结点
int height=;//树的高度
BiTree() {root=NULL;}
//层序创建二叉树
void create_level(string &s)
{
int p=;
root=new Node(); Node *t,*i,*j;
queue<Node*> qTree;//定义一个队列,存储节点
while(true)
{
if(p==s.size())break;
if(p==)//当头结点未创建
{
t=new Node();
t->data=s[p];
qTree.push(t);//头结点进队
root=t;
p++;
}
else
{
t=qTree.front();//该节点出队
if(p==s.size())break;//树的构建完毕
if(s[p]=='#')//不存在左节点
{
t->lchild=NULL;
p++;
}
else//存在左节点
{
i=new Node();
i->data=s[p];
t->lchild=i;//左节点进队
qTree.push(i);
p++;
} if(p==s.size())break;
if(s[p]=='#')//不存在右节点
{
t->rchild=NULL;
p++;
}
else//存在右节点
{
j=new Node();
j->data=s[p];
t->rchild=j;
qTree.push(j);
p++;
} qTree.pop();//节点左右节点已创建,该节点出队
}
} }
//前序递归创建二叉树
void create_pre(string s)
{
int p=-;
root=create(s,p);
}
Node *create(string &s,int &p)
{
++p;
Node *t;
if((unsigned)p>=s.size())
{
return NULL;
}
else
{
if(s[p]=='#')
{
t=NULL;
}
else
{
t=new Node;
t->data=s[p];
t->lchild=create(s,p);
t->rchild=create(s,p);
}
return t;
}
} //前序递归遍历二叉树
void read_pre_oder(Node *t)
{
if(t!=NULL)
{
cout<<t->data<<' ';
read_pre_oder(t->lchild);
read_pre_oder(t->rchild);
}
}
//中序递归遍历二叉树
void read_mid_oder(Node *t)
{
if(t!=NULL)
{
read_mid_oder(t->lchild);
cout<<t->data<<' ';
read_mid_oder(t->rchild);
}
}
//后续递归遍历二叉树
void read_beh_oder(Node *t)
{
if(t!=NULL)
{
read_beh_oder(t->lchild);
read_beh_oder(t->rchild);
cout<<t->data<<' ';
}
} //利用栈实现前序遍历二叉树
void read_pre_oder_stack(Node *t)
{
if(t!=NULL)
{
stack<Node*> sTree;//声明一个栈存储节点
while(true)
{
if(sTree.size()==&&t==NULL) break;
while(true)//一直遍历左节点,输出
{
if(t==NULL) break;//该节点不存在左节点,跳出循环
cout<<t->data<<' ';
sTree.push(t);//节点进栈,以便后期遍历右节点
t=t->lchild;
}
t=sTree.top();//查看该节点是否存在右子树
sTree.pop();//节点已遍历出栈
/*遍历该节点右子树,若不存在右子树,继续循环,
存在则进入内部while循环查找该右子树的左节点*/
t=t->rchild; }
}
}
//利用栈实现中序遍历二叉树
void read_mid_oder_stack(Node *t)
{
if(t!=NULL)
{
stack<Node*> sTree;//声明一个栈存储节点
while(true)
{
if(sTree.size()==&&t==NULL) break;
while(true)
{
if(t==NULL) break;
sTree.push(t);//一直存储左节点
t=t->lchild;
}
t=sTree.top();
cout<<t->data<<' ';//不存在左节点,输出该节点
sTree.pop();//该节点出栈
t=t->rchild;//查找该节点的右子树
}
}
}
//利用栈实现后序遍历二叉树
void read_beh_oder_stack(Node *t)
{
if(t!=NULL)
{
stack<Node*> sTree1;//该栈用于存储遍历过程的节点
stack<Node*> sTree2;//该栈用于存储遍历结果,输出
sTree1.push(t);//头节点进栈
while(true)
{
if (sTree1.size()==) break;
t=sTree1.top();
sTree1.pop();
if(t->lchild!=NULL)//存在左节点,节点进栈
{
sTree1.push(t->lchild);
}
if(t->rchild!=NULL)//存在右节点,节点进栈
{
sTree1.push(t->rchild);
}
sTree2.push(t);//存储该节点(第一步开始存储的就是头节点,头结点存储在栈底)
}
while(true)//输出
{
if(sTree2.size()==) break;
t=sTree2.top();
cout<<t->data<<' ';
sTree2.pop();
}
}
}
//利用栈、队列实现层序遍历
void read_lev_oder_stack(Node *t)
{
if(t!=NULL)
{
stack<Node*> sTree;
queue<Node*> qTree;
sTree.push(t);
qTree.push(t);
while(true)
{
if(sTree.size()==)break;
t=sTree.top();
sTree.pop();
if(t->lchild!=NULL)
{
sTree.push(t->lchild);
qTree.push(t->lchild);
}
if(t->rchild!=NULL)
{
sTree.push(t->rchild);
qTree.push(t->rchild);
}
}
while(true)
{
if(qTree.size()==) break;
t=qTree.front();
cout<<t->data<<' ';
qTree.pop();
}
}
} //求树的高度
int tree_height(Node *t)
{
get_height(t,);
return height;
}
void get_height(Node *t,int h)
{
if(t==NULL) return;
h++;
if(h>height)
{
height=h;
}
get_height(t->lchild,h);
get_height(t->rchild,h);
}
}; int main()
{
BiTree a;
string s;
s="ABD##E#F##C##"; // a.create_level(s);
a.create_pre(s); cout<<"递归实现前序遍历"<<endl;
a.read_pre_oder(a.root);
cout<<endl<<"递归实现中序遍历"<<endl;
a.read_mid_oder(a.root);
cout<<endl<<"递归实现后序遍历"<<endl;
a.read_beh_oder(a.root);
cout<<endl; cout<<"栈实现前序遍历"<<endl;
a.read_pre_oder_stack(a.root);
cout<<endl<<"栈实现中序遍历"<<endl;
a.read_mid_oder_stack(a.root);
cout<<endl<<"栈实现后序遍历"<<endl;
a.read_beh_oder_stack(a.root);
cout<<endl<<"栈、队列实现层序遍历"<<endl;
a.read_lev_oder_stack(a.root);
cout<<endl<<"树的高度为: "<<endl; int height=a.tree_height(a.root);
cout<<height<<endl; return ;
}

参考地址:https://blog.csdn.net/ajay666/article/details/76736333https://www.cnblogs.com/ybf-yyj/p/8717601.html

c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历的更多相关文章

  1. 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)

    一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...

  2. Reverse Linked List 递归非递归实现

    单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...

  3. 递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)

    递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...

  4. Java实现二叉树的创建、递归/非递归遍历

    近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...

  5. 二叉树的递归,非递归遍历(C++)

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

  6. C++二叉树前中后序遍历(递归&非递归)统一代码格式

    统一下二叉树的代码格式,递归和非递归都统一格式,方便记忆管理. 三种递归格式: 前序遍历: void PreOrder(TreeNode* root, vector<int>&pa ...

  7. 二叉树的先序、中序以及后序遍历(递归 && 非递归)

    树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...

  8. 二叉树——遍历篇(递归/非递归,C++)

    二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...

  9. 二叉树总结—建树和4种遍历方式(递归&&非递归)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...

  10. [leetcode] 二叉树的前序,中序,后续,层次遍历

    前序遍历 [144] Binary Tree Preorder Traversal 递归遍历 使用递归,先保存父节点的值,再对左子树进行遍历(递归),最后对右子树进行遍历(递归) vector< ...

随机推荐

  1. maven的传递性依赖

    一.概念: 假如有maven项目A,项目A依赖项目B,项目B依赖项目C,我们说A对B是第一直接依赖,B对C是第二直接依赖,那么他们的依赖关系:A---->B----->C,那么我们执行项目 ...

  2. 第22章:MongoDB-聚合操作--聚合管道--$out

    ①$out $out:利用此操作可以将查询结果输出到指定的集合里面. ②范例:将投影的结果输出到集合里

  3. Ubuntu 默认启动到命令行 12.04

    源文链接:http://my.oschina.net/jackguo/blog/85706 代码: sudo gedit /etc/default/grub 引用: GRUB_CMDLINE_LINU ...

  4. ArcMap等值面

    先说一下题目,ArcMap中没有由栅格直接生成等值面的功能,但由栅格直接生成等值线的功能存在,可通过如下方式得到等值面: 1.提取等值线 由dem直接提取等值线:Spatial Analyst Too ...

  5. 用Dagger2在Android中实现依赖注入

    依赖注入这个模式(模式已经用烂了,这里再烂一次)是用来给应用的各部分解耦的.使应用开发更加可扩展,更容易维护.通过本文你会学到如何使用Dagger2来处理依赖. 简介 如果以对象需要另外的一个对象才能 ...

  6. (转)MVC语法-基础

    好久没有关注微软的开发了,今天看到了MVC3,顺便学习学习,我觉得Razor是个不错的做法,比使用<%%>简单多了,而且好看.首先“_”开头的cshtml文档将不能在服务器上访问,和asp ...

  7. slice()

    提取字符串中的一部分,并返回这个新的字符串 str.slice(beginSlice[, endSlice]) 参数 beginSlice 从该索引(以 0 为基数)处开始提取原字符串中的字符.如果值 ...

  8. MapGIS计算瓦片数据集

    https://www.docin.com/p-2103834433.html

  9. day36(动态代理)

    动态代理 动态代理:是实现增强类中的一种方式,jdk中的动态代理:Proxy对象,使用最广泛的是在AOP切面编程中. 实现一个简单的动态代理来了解其中的运行机制. 创建一个接口:Person类型的接口 ...

  10. Leetcode--1. Two Sum(easy)

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...