二叉树的前序、中序、后序遍历(递归与非递归)
2017-03-31 13:55
423 查看
本文主要总结二叉树的前序、中序、后序遍历,分为递归和非递归
(1)前序遍历:根→左→右
(2)中序遍历:左→根→右
(3)后序遍历:左→右→根
首先定义一个二叉树:
struct BiTree
{
char val;
BiTree *lchild;
BiTree *rchild;
};
1.递归的方法
(1)前序遍历(根→左→右)
void PreOrderTraverse(BiTree*
root)
{
if (root!=NULL)
{
cout<<root->val;
PreOrderTraverse(root->lchild);
PreOrderTraverse(root->rchild);
}
}
(2)中序遍历(左→根→右)
void InOrderTraverse(BiTree*
root)
{
if (root!=NULL)
{
InOrderTraverse(root->lchild);
cout<<root->val;
InOrderTraverse(root->rchild);
}
}
(3)后序遍历(左→右→根)
void PostOrderTraverse(BiTree*
root)
{
if (root!=NULL)
{
PostOrderTraverse(root->lchild);
PostOrderTraverse(root->rchild);
cout<<root->val;
}
}
2.非递归遍历:用到了栈
(1)前序
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
std::stack<TreeNode*> temp;
while (root || !temp.empty()) {
while (root) {
temp.push(root);
res.push_back(root->val);
root = root->left;
}
root = temp.top();
temp.pop();
root = root->right;
}
return res;
}
(2)中序
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
std::stack<TreeNode*> temp;
while (root || !temp.empty()) {
while (root) {
temp.push(root);
root = root->left;
}
root = temp.top();
temp.pop();
res.push_back(root->val);
root = root->right;
}
return res;
}
(3)后序
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
std::stack<TreeNode*> temp;
while (root || !temp.empty()) {
while (root) {
temp.push(root);
res.insert(res.begin(),root->val);
root = root->right;
}
root = temp.top();
temp.pop();
root = root->left;
}
return res;
}
(1)前序遍历:根→左→右
(2)中序遍历:左→根→右
(3)后序遍历:左→右→根
首先定义一个二叉树:
struct BiTree
{
char val;
BiTree *lchild;
BiTree *rchild;
};
1.递归的方法
(1)前序遍历(根→左→右)
void PreOrderTraverse(BiTree*
root)
{
if (root!=NULL)
{
cout<<root->val;
PreOrderTraverse(root->lchild);
PreOrderTraverse(root->rchild);
}
}
(2)中序遍历(左→根→右)
void InOrderTraverse(BiTree*
root)
{
if (root!=NULL)
{
InOrderTraverse(root->lchild);
cout<<root->val;
InOrderTraverse(root->rchild);
}
}
(3)后序遍历(左→右→根)
void PostOrderTraverse(BiTree*
root)
{
if (root!=NULL)
{
PostOrderTraverse(root->lchild);
PostOrderTraverse(root->rchild);
cout<<root->val;
}
}
2.非递归遍历:用到了栈
(1)前序
vector<int> preorderTraversal(TreeNode* root) {
vector<int> res;
std::stack<TreeNode*> temp;
while (root || !temp.empty()) {
while (root) {
temp.push(root);
res.push_back(root->val);
root = root->left;
}
root = temp.top();
temp.pop();
root = root->right;
}
return res;
}
(2)中序
vector<int> inorderTraversal(TreeNode* root) {
vector<int> res;
std::stack<TreeNode*> temp;
while (root || !temp.empty()) {
while (root) {
temp.push(root);
root = root->left;
}
root = temp.top();
temp.pop();
res.push_back(root->val);
root = root->right;
}
return res;
}
(3)后序
vector<int> postorderTraversal(TreeNode* root) {
vector<int> res;
std::stack<TreeNode*> temp;
while (root || !temp.empty()) {
while (root) {
temp.push(root);
res.insert(res.begin(),root->val);
root = root->right;
}
root = temp.top();
temp.pop();
root = root->left;
}
return res;
}
相关文章推荐
- c++实现二叉树的非递归创建以及非递归先序、中序、后序遍历
- 用非递归实现二叉树的前序、中序、后序、层次遍历,用递归实现查找、统计个数、比较、求深度
- 二叉树2:层次遍历方式及先序、中序、后序(递归与非递归)遍历方式
- 二叉树的先序,中序,后序,层次的递归及非递归遍历
- java语言实现二叉树的前序、中序与后序遍历(递归与非递归) 层次遍历
- 数据结构---二叉树的前序、中序、后序遍历的递归和非递归 实现(C++)
- 二叉树详解及二叉树的前序、中序、后序遍历(递归和非递归)
- 二叉树的深度优先dfs遍历(前序、中序和后序;递归与非递归)
- 数据结构:二叉树的前序,中序,后序遍历(递归和非递归)
- 二叉树的建树、遍历(先序、中序、后序、层次)(递归和非递归)--Java实现
- 二叉树的先序中序后序遍历 (递归和非递归)
- java语言实现二叉树的前序、中序与后序遍历(递归与非递归)
- 数据结构-二叉树的前序、中序、后序遍历的递归和非递归实现
- 二叉树的前序,中序,后序遍历。用递归和非递归实现
- 二叉树前序、中序和后序非递归遍历的方法
- 二叉树前序、中序、后序非递归遍历实现(C语言)
- 二叉树的非递归遍历方式(前序、中序和后序)
- 二叉树的前序,中序,后续,递归及非递归遍历的python实现
- 二叉树前序、中序、后序遍历非递归写法的透彻解析
- C语言递归实现二叉树的先序、中序、后序遍历