先序,中序,后序用循环和递归的实现
来源:互联网 发布:重生之徐徐图之易知 编辑:程序博客网 时间:2024/05/22 00:19
先序,中序,后序用循环和递归的实现
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
struct binaryTreeNode
{
int m_data;
binaryTreeNode *m_left;
binaryTreeNode *m_right;
};
vector<int> result;
//递归先序遍历
void preOderTraversal(binaryTreeNode *root)
{
if(root!=NULL)
{
result.push_back(root->m_data);
if(root->m_left!=NULL)
inOderTraversal(root->m_left);
if(root->m_right!=NULL)
inOderTraversal(root->m_right);
}
}
//先实现循环先序遍历
vector<int> preOderTraversal1(binaryTreeNode *root)
{
stack<binaryTreeNode *> stack1;
vector<int> v;
binaryTreeNode *k;
if(root!=NULL)
{
stack1.push(root);
}
while(stack1.size()>0)
{
k=stack1.top();
v.push_back(k->m_data);
stack1.pop();
if(k->m_right!=NULL)
{
stack1.push(k->m_right);
}
if(k->m_left!=NULL)
{
stack1.push(k->m_left);
}
}
return v;
}
//递归中序遍历
void inOderTraversal(binaryTreeNode *root)
{
if(root!=null)
{
if(root->m_left!=NULL)
{
inOderTraversal(root->m_left);
}
result.push_back(root->m_data);
if(root->m_right!=NULL)
{
inOderTraversal(root->m_right);
}
}
}
//循环中序遍历
vector<int> inOdertraversal1(binaryTreeNode *root)
{
stack<binaryTreeNode *> stack1;
vector<int> v;
binaryTreeNode * k;
while(stack1.size()||root!=NULL)
{
if(root!=NULL)
{
stack1.push(root);
root=root->m_left;
}
else
{
root=stack1.top();
stack1.pop();
v.push_back(k->m_data);
root=root->m_right;
}
}
return v;
}
//递归后序遍历
void postOderTraversal(binaryTreeNode *root)
{
if(root!=NULL)
{
if(root->m_left!=NULL)
{
postOderTraversal(root->m_left);
}
if(root->m_right!=NULL)
{
postOderTraversal(root->m_right);
}
result.push_back(root->m_data);
}
}
//循环后序遍历
vector<int> postOderTraversal1(binaryTreeNode *root)
{
stack<binaryTreeNode *> stack1;
vector<int> v;
//binaryTreeNode * k;
if(root!=NULL)
{
stack1.push(root);
}
while(stack1.size()>0)
{
root=stack1.top();
stack1.pop();
v.push_back(root->m_data);
if(root->m_left!=NULL)
{
stack1.push(root->m_left);
}
if(root->m_right!=NULL)
{
stack1.push(root->m_right);
}
}
std::reverse(v.begin(),v.end());
return v;
}
分析:在用循环实现先序遍历时(中左右的访问方式),先访问root->m_data,然后在进栈stack1.push(root->m_right),最后在stack1.push(root->m_left).
栈的操作为:进栈root,出栈root(进动态数组vector),进栈root->right,进栈root->left,出栈root->left(进动态数组vector,root=root->left),进栈root->right,进栈root->left,出栈root->left
(进动态数组vector,root=root->left),就这样一直循环下去,实现了先序遍历。
而在用循环实现后序遍历时(左右中的访问方式),先访问root->m_data,然后在进栈stack1.push(root->m_left),最后在stack1.push(root->m_right);
左右中的倒过来为中右左,只要把中左右稍微改一下就可以实现。
在用循环实现中序遍历时(左右中的访问方式),首先它用的if..else..这个分叉,来实现二叉树的分叉,进栈root,进栈root->left(root=root->left),进栈root->left,直到为空,然后出栈(root=出栈,)并且进动态数组(vector),(root=root->right),继续循环。
- 先序,中序,后序用循环和递归的实现
- JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)
- JAVA下实现二叉树的先序、中序、后序、层序遍历(递归和循环)
- Java实现二叉树的递归构建及先序、中序、后序、层序遍历(递归和循环)
- 二叉树的先序、中序、后序遍历的递归和非递归实现
- 二叉树的先序、中序、后续遍历的递归和非递归实现
- 二叉树的先序,中序,后序递归和非递归实现
- 二叉树的中序、先序、后序遍历非递归遍历算法(使用堆栈,用循环实现)
- 递归和非递归的方式实现二叉树的先序、中序和后序遍历
- 分别用递归和非递归方式实现二叉树的先序、中序和后序遍历
- 树--递归实现先、中、后遍历,层序遍历和树的深度
- 二叉树的先序遍历,递归实现与循环实现
- 二叉树的创建(先序创建的)及先序遍历 中序遍历 后序遍历的递归和非递归实现
- 非递归的先序遍历和中序遍历
- 二叉树的建树、遍历(先序、中序、后序、层次)(递归和非递归)--Java实现
- 二叉树的先序、中序和后序遍历,递归与非递归方式实现。
- 树的先序遍历、中序遍历、后续遍历的递归与循环详解
- 面试:递归和非递归方式实现先序、中序、后序遍历代码
- 小技巧:Total Commander中的批处理功能
- 【十万个为什么】—— 为什么手机/电脑开机之后时间还是对的?
- 使用wsimport生成webservice请求代码
- Linux,数据库,计算机网络以及C++&Java面试问题补充
- checkbox 获取选中值
- 先序,中序,后序用循环和递归的实现
- URL正则表达式最全面的验证
- 关于bridge-nf-call-iptables的设计问题
- 5.0+学习计划--CardView
- retrofit学习
- JavaScript 为变量添加默认值
- APP性能优化系列:内存优化-bitmap详解
- git on server
- ios蓝牙浅谈