新网创想网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
创新互联建站于2013年创立,先为肃北等服务建站,肃北等地企业,进行企业商务咨询服务。为肃北企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。文章目录
目录
文章目录
前言
树的结构体定义
二叉树的创建(先序递归)
二叉树的先序遍历(递归)
二叉树的中序遍历(递归)
二叉树的后序遍历(递归)
二叉树的先序非递归遍历算法1
二叉树的先序非递归遍历算法2
二叉树的中序非递归算法
二叉树的后序非递归算法1
二叉树的非递归后序遍历算法2
二叉树的层次遍历算法
主函数
本篇文章主要包括二叉树的创建以及二叉树的前序、中序、后序遍历的递归算法以及前序、中序、后序、层次遍历的非递归算法
typedef struct node{
char data;
struct node *lchild,*rchild;
}*BiTree;
//递归建立二叉树(先序遍历)
void CreatBiTree(BiTree &T){
char c;
cin>>c;
if(c=='0'){
T=NULL;
}else{
T=new node;
T->data=c;
CreatBiTree(T->lchild);
CreatBiTree(T->rchild);
}
}
//先序遍历递归
void PreOrder(BiTree T){
if(T!=NULL){
cout<data<<' ';
PreOrder(T->lchild);
PreOrder(T->rchild);
}
}
//递归中序遍历
void InOrder(BiTree T){
if(T!=NULL){
InOrder(T->lchild);
cout<data<<' ';
InOrder(T->rchild);
}
}
//递归后序遍历算法
void PostOrder(BiTree T){
if(T!=NULL){
PostOrder(T->lchild);
PostOrder(T->rchild);
cout<data<<' ';
}
}
头文件中要包含#include
//非递归先序遍历算法1
void PreOrder1(BiTree T){
if(T!=NULL){
stackSt;
BiTree p;
St.push(T);
while(!St.empty()){
p=St.top();
St.pop();
cout<data<<' ';
if(p->rchild!=NULL){
St.push(p->rchild);
}
if(p->lchild!=NULL){
St.push(p->lchild);
}
}
}
}
//非递归先序遍历2
void PreOrder2(BiTree T){
if(T!=NULL){
stackSt;
BiTree p=T;
while(!St.empty()||p!=NULL){
while(p!=NULL){
cout<data<<' ';
St.push(p);
p=p->lchild;
}
if(!St.empty()){
p=St.top();
St.pop();
p=p->rchild;
}
}
}
}
与先序非递归遍历算法2的区别仅在于节点值输出的位置不同
//非递归中序遍历
void InOrder1(BiTree T){
if(T!=NULL){
stackSt;
BiTree p=T;
while(!St.empty()||p!=NULL){
while(p!=NULL){
St.push(p);
p=p->lchild;
}
if(!St.empty()){
p=St.top();
St.pop();
cout<data<<' ';
p=p->rchild;
}
}
}
}
需要用到两个栈
//非递归后序遍历算法1
void PostOrder1(BiTree T){
if(T!=NULL){
stackSt1;
stackSt2;
BiTree p=NULL;
St1.push(T);
while(!St1.empty()){
p=St1.top();
St1.pop();
St2.push(p);
if(p->lchild!=NULL){
St1.push(p->lchild);
}
if(p->rchild!=NULL){
St1.push(p->rchild);
}
}
while(!St2.empty()){
p=St2.top();
St2.pop();
cout<data<<' ';
}
}
}
这个算法具有一个良好的性质:每当访问到这个节点时,栈中存放的是这个节点的祖先节点。由这个算法可以改写得到其他许多问题的解法。
//非递归后序遍历算法2
void PostOrder2(BiTree T){
if(T!=NULL){
stackSt;
BiTree p=T;
BiTree r=NULL;
while(p!=NULL||!St.empty()){
if(p!=NULL){
St.push(p);
p=p->lchild;
}
else{
p=St.top();
if(p->rchild!=NULL&&p->rchild!=r){
p=p->rchild;
}else{
p=St.top();
St.pop();
cout<data<<' ';
r=p;
p=NULL;
}
}
}
}
}
头文件中要包含#include
//层次遍历
void LevelOrder(BiTree T){
queueQ;
Q.push(T);
BiTree p;
while(!Q.empty()){
p=Q.front();
Q.pop();
cout<data<<' ';
if(p->lchild!=NULL){
Q.push(p->lchild);
}
if(p->rchild!=NULL){
Q.push(p->rchild);
}
}
}
主函数
int main(){
system("chcp 65001");//控制输出中文
BiTree T;
CreatBiTree(T);
cout<<"二叉树的先序遍历序列为:";
PreOrder(T);
cout<
运行结果如下图所示:
上例中建的树如下图所示:
总结以上就是这篇文章的全部内容,介绍了二叉树的构建以及遍历。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧