二叉树的遍历(递归,非递归,层次)
来源:互联网 发布:最简单的c语言小游戏 编辑:程序博客网 时间:2024/06/16 01:24
一.前序遍历
void preOrder1(BinTree *root) //递归前序遍历
{if(root!=NULL)
{cout<<root->data<<" ";
preOrder1(root->lchild);
preOrder1(root->rchild);
}
}
void preOrder2(BinTree *root) //非递归前序遍历 {
stack<BinTree*> s;
BinTree *p=root;
while(p!=NULL||!s.empty()){
while(p!=NULL){
cout<<p->data<<" ";
s.push(p);
p=p->lchild;
}
if(!s.empty()){
p=s.top();
s.pop();
p=p->rchild;
}}}
二.中序遍历
void inOrder1(BinTree *root) //递归中序遍历
{
if(root!=NULL)
{
inOrder1(root->lchild);
cout<<root->data<<" ";
inOrder1(root->rchild);
}
}
void inOrder2(BinTree *root) //非递归中序遍历
{
stack<BinTree*> s;
BinTree *p=root;
while(p!=NULL||!s.empty()){
while(p!=NULL){
s.push(p);
p=p->lchild;
}
if(!s.empty())
{p=s.top();
cout<<p->data<<" ";
s.pop();
p=p->rchild;
}
}
}
void postOrder1(BinTree *root) //递归后序遍历{
if(root!=NULL){
postOrder1(root->lchild);
postOrder1(root->rchild);
cout<<root->data<<" ";
}
}
void postOrder2(BinTree *root) //非递归后序遍历{
stack<BTNode*> s;
BinTree *p=root;
BTNode *temp;
while(p!=NULL||!s.empty()){
while(p!=NULL) //沿左子树一直往下搜索,直至出现没有左子树的结点 {
BTNode *btn=(BTNode *)malloc(sizeof(BTNode));
btn->btnode=p;
btn->isFirst=true;
s.push(btn);
p=p->lchild;
}
if(!s.empty()){
temp=s.top();
s.pop();
if(temp->isFirst==true) //表示是第一次出现在栈顶 {
temp->isFirst=false;
s.push(temp);
p=temp->btnode->rchild;
}else //第二次出现在栈顶 {
cout<<temp->btnode->data<<" ";
p=NULL;
}
}
}
}
void postOrder3(BinTree *root) //非递归后序遍历{
stack<BinTree*> s;BinTree *cur; //当前结点
BinTree *pre=NULL; //前一次访问的结点
s.push(root);
while(!s.empty()){
cur=s.top();
if((cur->lchild==NULL&&cur->rchild==NULL)||(pre!=NULL&&(pre==cur->lchild||pre==cur->rchild)))
{cout<<cur->data<<" "; //如果当前结点没有孩子结点或者孩子节点都已被访问过
s.pop();
pre=cur;
}
else
{
if(cur->rchild!=NULL)s.push(cur->rchild);
if(cur->lchild!=NULL) s.push(cur->lchild);
}
}
}
- /层序遍历
- void Tree::LevelOrderVisit(BinTree *T)
- {
- queue<BinTree *>Q;
- if(!T)
- return;
- Q.push(T);
- BinTree *temp=NULL;
- while(!Q.empty())
- {
- temp=Q.front();
- cout<<temp->data<<'/t';
- Q.pop();
- if(temp->Left)
- Q.push(temp->Left);
- if(temp->Right)
- Q.push(temp->Right);
- }
- }
- 二叉树的遍历(递归+非递归+层次遍历)
- 二叉树的遍历(递归,非递归,层次)
- 二叉树的遍历(递归,非递归,层次)
- 二叉树的非递归层次遍历
- 二叉树遍历(层次,递归,非递归)
- 二叉树的递归,层次,以及非递归遍历
- 二叉树的各种遍历(递归,非递归,层次)
- 二叉树的递归、层次与非递归遍历
- 层次遍历求二叉树的高度(非递归)
- 二叉树的前序中序后序遍历,非递归遍历 层次遍历
- 二叉树的非递归遍历及层次遍历
- 二叉树的非递归遍历以及层次遍历
- 二叉树的非递归遍历,层次遍历
- 非递归按层次遍历二叉树
- 非递归二叉树层次遍历算法
- 二叉树非递归层次遍历
- 二叉树(前中后序递归非递归遍历,层次遍历
- 二叉树各种遍历的实现(递归、非递归、层次、高度和节点数目)
- 随着城市化建设进程的加快,贵阳也迎来了城市蝶变的新契机,
- java 语音
- MySQL单列索引和组合索引的区别介绍
- 可以自动登录的Ubuntu,重置root和其他普通用户密码的方法
- 苹果iOS 7后台机制解析
- 二叉树的遍历(递归,非递归,层次)
- java将阿拉伯数字转换为中文
- Newtonsoft.Json取json字符串中的值得用法
- jQuery获取页面及元素高度、宽度
- Ubuntu 14.04中文输入法的安装
- c# 解析JSON的几种办法
- (译)KVO的内部实现
- acess trunk hybrid 二三层转发原理
- php获取客户端IP地址的几种方法(转)