c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历
#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/76736333、https://www.cnblogs.com/ybf-yyj/p/8717601.html
c++实现二叉树层序、前序创建二叉树,递归非递归实现二叉树遍历的更多相关文章
- 【数据结构】——搜索二叉树的插入,查找和删除(递归&非递归)
一.搜索二叉树的插入,查找,删除 简单说说搜索二叉树概念: 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右 ...
- Reverse Linked List 递归非递归实现
单链表反转--递归非递归实现 Java接口: ListNode reverseList(ListNode head) 非递归的实现 有2种,参考 头结点插入法 就地反转 递归的实现 1) Divide ...
- 递归/非递归----python深度遍历二叉树(前序遍历,中序遍历,后序遍历)
递归代码:递归实现很简单 '二叉树结点类' class TreeNode: def __init__(self, x): self.val = x self.left = None self.righ ...
- Java实现二叉树的创建、递归/非递归遍历
近期复习数据结构中的二叉树的相关问题,在这里整理一下 这里包含: 1.二叉树的先序创建 2.二叉树的递归先序遍历 3.二叉树的非递归先序遍历 4.二叉树的递归中序遍历 5.二叉树的非递归中序遍历 6. ...
- 二叉树的递归,非递归遍历(C++)
二叉树是一种非常重要的数据结构,很多其它数据结构都是基于二叉树的基础演变而来的.对于二叉树,有前序.中序以及后序三种遍历方法.因为树的定义本身就是递归定义,因此采用递归的方法去实现树的三种遍历不仅容易 ...
- C++二叉树前中后序遍历(递归&非递归)统一代码格式
统一下二叉树的代码格式,递归和非递归都统一格式,方便记忆管理. 三种递归格式: 前序遍历: void PreOrder(TreeNode* root, vector<int>&pa ...
- 二叉树的先序、中序以及后序遍历(递归 && 非递归)
树节点定义: class TreeNode { int val; TreeNode left; TreeNode right; TreeNode(int x) { val = x; } } 递归建立二 ...
- 二叉树——遍历篇(递归/非递归,C++)
二叉树--遍历篇 二叉树很多算法题都与其遍历相关,笔者经过大量学习.思考,整理总结写下二叉树的遍历篇,涵盖递归和非递归实现. 1.二叉树数据结构及访问函数 #include <stdio.h&g ...
- 二叉树总结—建树和4种遍历方式(递归&&非递归)
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013497151/article/details/27967155 今天总结一下二叉树.要考离散了 ...
- [leetcode] 二叉树的前序,中序,后续,层次遍历
前序遍历 [144] Binary Tree Preorder Traversal 递归遍历 使用递归,先保存父节点的值,再对左子树进行遍历(递归),最后对右子树进行遍历(递归) vector< ...
随机推荐
- idea创建maven项目报错,Error initializing: org.codehaus.plexus.velocity.DefaultVelocityComponent@56da52a7 java.lang.NoClassDefFoundError: org/apache/commons/lang/StringUtils
学着使用idea,想创建个maven项目,但是出师不利,立马报错,贼尴尬,错误信息如下: D:\Develop\JDK\bin\java.exe -Dmaven.multiModuleProjectD ...
- dom4j 通过 org.dom4j.DocumentFactory 设置命名空间来支持 带namespace 的 xpath
测试文件 test.xml <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http:/ ...
- crontab和crond分析
目录 目录 1 1. 研究目的 1 2. 基本概念 1 3. crontab 1 3.1. 编辑 2 3.1.1. "crontab -e"工作流 2 3.2. 问题 3 4. c ...
- MIT Molecular Biology 笔记7 调控RNA
视频 https://www.bilibili.com/video/av7973580/ 教材 Molecular biology of the gene 7th edition J.D. Wat ...
- 一份不太简短的LaTeX模板
编译环境: Ubuntu16.04 texllive2016 sublime text3 + latextools 该模板使用与自己写文档,记笔记,记录代码,写作业等等. %!TEX program ...
- noip第6课资料
- HDU3488 Tour
Tour Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) Total Submi ...
- vc6中向vs2010迁移的几个问题
vc6版本支持的库编译:CJ60lib 1. 用vs2010打开CJ60库的源码的dsw,强制打开 (1)设置项目属性的语言 因为,如果代码字符的编码集不一样,则会出现函数冲定义,参数冲突等问题,这可 ...
- hdu 4704 Sum 【费马小定理】
题目 题意:将N拆分成1-n个数,问有多少种组成方法. 例如:N=4,将N拆分成1个数,结果就是4:将N拆分成2个数,结果就是3(即:1+3,2+2,3+1)--1+3和3+1这个算两个,则这个就是组 ...
- 区间DP POJ1160村庄邮局问题
POJ1160 题目大意:一系列村庄在一维坐标系上有序的排列,建设p个邮局,问各个村庄到邮局的最短距离和. 线性区间DP问题 dp数组的值为最短/最优距离 村庄和邮局为限制 dp[i][j]表示前i个 ...