C++实现二叉树的前中后和层序遍历(递归和非递归写法)
参考以下图解,这个文章写得真好
————————————————
版权声明:本文为CSDN博主「Monster_ii」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/monster_ii/article/details/82115772
// PrintFromTopToBottom.cpp : 定义控制台应用程序的入口点。
//层序遍历,利用队列的先进先出,即二叉树的广度遍历
//回顾:前中后序遍历,递归或者迭代(利用栈后进先出)
#include "stdafx.h"
#include <vector>
#include <queue>
#include <stack>
using namespace std;
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};
class Solution {
public:
//层序
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> result;
queue<TreeNode*> q;
TreeNode* cur;
if (root == NULL)//鲁棒性
{
return result;
}
q.push(root);
while (!q.empty())//直到没有结点
{
cur = q.front();//弹出队列第一个
q.pop();//获取之后去掉队列第一个
result.push_back(cur->val);//打印出当前结点值
if (cur->left)//如果当前节点有左子树,存储左子树
{
q.push(cur->left);
}
if (cur->right)//如果当前节点有右子树,存储右子树
{
q.push(cur->right);
}
}
return result;
}
//前序递归
void PreOrder(TreeNode* root,vector<int>* preorder)
{
if (root!=NULL)
{
preorder->push_back(root->val);
PreOrder(root->left, preorder);
PreOrder(root->right, preorder);
}
}
//前序非递归
vector<int> PreOrderLoop(TreeNode* root)
{
vector<int> result;
stack<TreeNode*> s;
TreeNode* cur; TreeNode* top;
cur = root;
while (cur != nullptr || !s.empty())
{
while (cur != nullptr)
{
result.push_back(cur->val);
s.push(cur);
cur = cur->left;
}
top = s.top();
s.pop();
cur = top->right;
}
return result;
}
//中序递归
void InOrder(TreeNode* root, vector<int>* inorder)
{
if (root != NULL)
{
InOrder(root->left, inorder);
inorder->push_back(root->val);
InOrder(root->right, inorder);
}
}
//中序非递归
vector<int>InOrderLoop(TreeNode* root)
{
vector<int>result;
stack<TreeNode*>s;
TreeNode* cur;
TreeNode* top;
cur = root;
while (cur!= nullptr || !s.empty())
{
while (cur != nullptr)
{
s.push(cur);
cur = cur->left;
}
top = s.top();
s.pop();
result.push_back(top->val);
cur = top->right;
}
return result;
}
//后序递归
void PostOrder(TreeNode* root, vector<int>* postorder)
{
if (root != NULL)
{
PostOrder(root->left, postorder);
PostOrder(root->right, postorder);
postorder->push_back(root->val);
}
}
//后序非递归
vector<int>PostOrderLoop(TreeNode* root)
{
vector<int>result;
stack<TreeNode*>s;
TreeNode* cur; TreeNode* top; TreeNode* last = nullptr;
cur = root;
while (cur!=nullptr || !s.empty())
{
while (cur != nullptr)
{
s.push(cur);
cur = cur->left;
}
top = s.top();
if (top->right==nullptr || top->right==last)
//如果top节点没有右子树,或者last等于top的右孩子,说明top的右子树不存在或者遍历过了,就输出top节点的值,并将栈顶元素pop掉(出栈)
{
s.pop();
result.push_back(top->val);
last = top;
}
else//反之则是从左子树回到根节点的,接下来要去右子树。
{
cur = top->right;
}
}
return result;
}
};
int main()
{
TreeNode pRoot1[7] = { 1,2,3,4,5,6,7 };
pRoot1[0].left = &pRoot1[1]; pRoot1[0].right = &pRoot1[2];
pRoot1[1].left = &pRoot1[3]; pRoot1[1].right = &pRoot1[4];
pRoot1[2].left = &pRoot1[5]; pRoot1[2].right = &pRoot1[6];
Solution s;
//层序
auto cexufeidigui = s.PrintFromTopToBottom(pRoot1);
//递归:前,中,后序
vector<int>preorder; vector<int>inorder; vector<int>postorder;
s.PreOrder(pRoot1, &preorder);s.InOrder(pRoot1, &inorder); s.PostOrder(pRoot1, &postorder);
//非递归:前,中,后序
auto preorderloop = s.PreOrderLoop(pRoot1);
auto inorderloop = s.InOrderLoop(pRoot1);
auto postorderloop = s.PostOrderLoop(pRoot1);
return 0;
}
前序遍历结果:
中序遍历结果:
后序遍历结果:
层序遍历结果: