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< ...
随机推荐
- es6函数的新语法
函数的默认值 function(x,y=10){ //赋予了y就有了默认值为10,如果y赋值了,就回被覆盖,否则就是默认值10 变量已经有默认值了,所以不用再次用let或者const声明啦 }
- js判断 pc 手机 浏览器
<script> var result = window.matchMedia('(max-width: 700px)'); var browser={ versions:function ...
- Spring MVC 指导文档解读(二)
Special Bean Types In the WebApplicationContext 解读 1.WebApplicationContext 特有的几种 Bean Types 2. 也表明 与 ...
- spark 中划分stage的思路
窄依赖指父RDD的每一个分区最多被一个子RDD的分区所用,表现为 一个父RDD的分区对应于一个子RDD的分区 两个父RDD的分区对应于一个子RDD 的分区. 宽依赖指子RDD的每个分区都要依赖于父RD ...
- 2018/6/29 关于hashmap的总结
hashMap和ConcurrentHashMap的区别 hashMap内部具体如何实现的 如果hashMap的key是一个自定义的类,怎么办 为什么重写equals还要重写hashcode 一.什么 ...
- 100度享乐电商网 html
<!DOCTYPE html><html> <head> <meta charset="utf-8" /> <title> ...
- kafka eagel的使用
sql语句eq: select * from "ke_test_topic" where "partition" in (0,1,2) limit 100 官网 ...
- ASP.NET Web API 框架研究 Controller创建 HttpController 类型解析 选择 创建
上一篇介绍了HttpController的一些细节,接下来说下HttpController 类型解析.选择和创建.生产HttpController实例的生产线如下图: 一.涉及的类及源码分析 涉及的类 ...
- 3.1.1随机事件的概率的Breamer(2018-03-22)
% !Mode:: "TeX:UTF-8" \documentclass[xcolor=svgnames,serif,table,12pt]{beamer}%, %\include ...
- Flashcache基本使用及注意事项
Flashcache基本使用及注意事项 发表回复 环境:Centos6.5 x64 minal 安装方法 Contents [hide] 1 安装方法 2 自动加载模块 3 创建Flashcache ...