C++实现二叉树的前中后和层序遍历(递归和非递归写法)

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;
}

 前序遍历结果:

  中序遍历结果:

后序遍历结果:

 

 层序遍历结果:

发布了23 篇原创文章 · 获赞 0 · 访问量 137

猜你喜欢

转载自blog.csdn.net/qq_35683407/article/details/104190848