二叉树创建和遍历
来源:互联网 发布:虚拟声卡软件 编辑:程序博客网 时间:2024/06/05 20:57
二叉树建立和简单遍历(递归和非递归遍历)
#include<iostream>
using namespace std;#define LEN sizeof(BiTree)
#include<malloc.h>
struct BiTree{
BiTree *lchild,*rchild;
char data;
};
BiTree* CreatBiTree() //类似先序遍历创立,空位置补*
{
BiTree *T;
char ch;cin>>ch;
if(ch=='*')T=NULL;
else{
T=(BiTree *)malloc(LEN);
T->data=ch;
T->lchild=CreatBiTree();
T->rchild=CreatBiTree();
}
return T;
}
{if(T)
{RecurBiTree(T->lchild);
cout<<T->data<<" ";
RecurBiTree(T->rchild);}
}
{
int i;
BiTree *p,*ar[100];
p=T,i=0;
if(T==NULL)return;
do{
while(p!=NULL)
{
ar[i]=p;i++;p=p->lchild;
}
if(i>0)
{
i--;p=ar[i];cout<<p->data<<" ";p=p->rchild; //s[i]没有赋值,i--是先回到根树;
}
}while(i>0||p!=NULL); //这里要加或着 p空仅仅出栈 i=0紧紧进栈 两者有一个成立也要运行
cout<<endl;
}
void NonRecurBiTree_3(BiTree *T) //非递归后序复杂一些,多了个判断
{
bool am[100]={0};
int i;
BiTree *p,*ar[100];
p=T,i=0;
if(T==NULL) return;
do{
while(p!=NULL)
{
ar[i]=p;i++;p=p->lchild; am[i-1]=0; //注意次序i始终是多1的 am[i-1]=0必须带 i是栈层数,当出栈后内容有变,应重新初始化
}
while(i>0&&am[i-1]==1){p=ar[i-1],cout<<p->data<<" ";i--;} //只有出栈i才自减
if(i>0){am[i-1]=1;p=ar[i-1]->rchild;} //不出栈就不自减,判断赋值用i-1;
}while(i>0);
}
int main()
{BiTree *Fb=CreatBiTree();
cout<<"递归掉用中序遍历二叉树"<<endl;
RecurBiTree(Fb);
cout<<endl; //递归不好在函数里加endl;
cout<<"利用栈非递归调用中序遍历二叉树"<<endl;
NonRecurBiTree_2(Fb);
cout<<"利用栈非递归调用后序遍历二叉树"<<endl;
NonRecurBiTree_3(Fb);
return 0;
}
递归的先序和后序和中序差不多 只要改一下输出流的位置就好了
非递归的先序和中序差不多,也是改一下输出位置,放在第一个whlie就好了:)
1 0
- 创建和遍历二叉树
- 二叉树创建和遍历
- 二叉树创建和遍历
- 二叉树-创建和遍历
- 二叉搜索树的创建和遍历
- 二叉树的创建,遍历和释放
- 简单的二叉树创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 二叉树创建和遍历详细分析
- 二叉树递归创建和递归遍历
- python中创建和遍历二叉树
- 二叉树的创建和遍历
- 二叉树的创建和遍历
- 数据结构---二叉树的创建和遍历
- 前序创建和遍历二叉树
- 二叉树的创建和遍历
- shell 脚本-sed工具
- 基于Metronic的Bootstrap开发框架经验总结(14)--条码和二维码的生成及打印处理
- h5 移动端响应式兼容
- Android基础之Activity生命周期和优先级
- 友善串口助手 V2.5.8.0825 Serial Port Utility注册码
- 二叉树创建和遍历
- Vbs脚本编程简明教程
- getopt在Python中的使用
- MySql bug (id=79163)
- 用nginx给kibana、elasticsearch做权限认证
- VBS基础篇 - 对象(3) - FileSystemObject对象
- Github年度开源报告出炉
- 网络判断
- 关于FileInputStream,FileReader和FileOutputStream,FileWriter区别问题