不熟悉< queue >用法,可以看看这篇博客:C++队列queue用法详解
强烈推荐课程:二叉树的层序遍历 二叉树的前中后序遍历
课程中印度的顶尖程序员Harsha Suryanarayana 详细讲解了递归在系统中怎么用栈实现的,受益匪浅。
一、广度优先-层序遍历
需要利用队列
1.1-创建一个简单的树
#include <iostream>
#include <queue>
using namespace std;
//节点定义
struct Node{
int date;//数据域
Node* left;//左指针
Node* right;//右指针
Node(int v):date(v),left(NULL),right(NULL){};//构造函数
};
//创建一个简单的树
Node* Creat_An_BTree()
{
Node* root = new Node(1);
Node* n1 = new Node(2);
Node* n2 = new Node(3);
Node* n3 = new Node(4);
Node* n4 = new Node(5);
Node* n5 = new Node(6);
Node* n6 = new Node(7);
root->left = n1;
root->right = n2;
n1->left = n3;
n1->right = n4;
n2->left = n5;
n2->right = n6;
return root;
}
int main()
{
Node* root = Creat_An_BTree();
return 0;
}
虽然创建好了,但是我们没有现在没有函数能一次访问到所有节点
1.2-层序遍历思路
队列是一种 FIFO(First In First Out)数据结构
访问的顺序就是层序遍历的结果啦
1.3-层序遍历代码
void LevelOrderTraversal(Node* root)
{
if(root==NULL) return;
queue<Node*> Q;
Q.push(root);
while(!Q.empty())
{
Node* cur = Q.front();
cout << cur->date << " " << endl;
if(cur->left!=NULL) Q.push(cur->left);
if(cur->right!=NULL) Q.push(cur->right);
Q.pop();
}
}
二、深度优先-前中后序遍历
2.1-前中后序访问根节点顺序说明
左右节点的顺序不变
遍历方式 | 访问顺序 |
---|---|
前序 | 根,左,右 |
中序 | 左,根,右 |
后序 | 左,右,根 |
2.2-前中后序遍历思路
使用递归,所谓的递归,就是系统自己调用了栈
在运行程序的过程中,系统把数据分成了四个区:
- 静态区:储存静态全局数据(static …)
- 栈区:储存调用函数中的数据(包括 main 函数)
- 堆区:程序运行中动态分配的数据(new/delete)
- 文本区:储存编译通过的二进制代码
2.3-前中后序遍历代码
Node* & root–运用了引用
//前序遍历
void PreOrderTraversal(Node* & root)
{
if(root==NULL) return;
cout << root->date << " ";
PreOrderTraversal(root->left);
PreOrderTraversal(root->right);
}
//中序遍历
void InOrderTraversal(Node* & root)
{
if(root==NULL) return;
InOrderTraversal(root->left);
cout << root->date << " ";
InOrderTraversal(root->right);
}
//先序遍历
void OutOrderTraversal(Node* & root)
{
if(root==NULL) return;
OutOrderTraversal(root->left);
OutOrderTraversal(root->right);
cout << root->date << " ";
}
三、全部代码
#include <iostream>
#include <queue>
using namespace std;
//节点定义
struct Node{
int date;
Node* left;
Node* right;
Node(int v):date(v),left(NULL),right(NULL){};
};
//创建一个简单的树
Node* Creat_An_BTree()
{
Node* root = new Node(1);
Node* n1 = new Node(2);
Node* n2 = new Node(3);
Node* n3 = new Node(4);
Node* n4 = new Node(5);
Node* n5 = new Node(6);
Node* n6 = new Node(7);
root->left = n1;
root->right = n2;
n1->left = n3;
n1->right = n4;
n2->left = n5;
n2->right = n6;
return root;
}
void LevelOrderTraversal(Node* root)
{
if(root==NULL) return;
queue<Node*> Q;
Q.push(root);
while(!Q.empty())
{
Node* cur = Q.front();
cout << cur->date << " ";
if(cur->left!=NULL) Q.push(cur->left);
if(cur->right!=NULL) Q.push(cur->right);
Q.pop();
// cout << "Q是否为空:" << Q.empty() << endl;
// cout << "Q元素个数:" << Q.size() << endl;
}
}
//前序遍历
void PreOrderTraversal(Node* & root)
{
if(root==NULL) return;
cout << root->date << " ";
PreOrderTraversal(root->left);
PreOrderTraversal(root->right);
}
//中序遍历
void InOrderTraversal(Node* & root)
{
if(root==NULL) return;
InOrderTraversal(root->left);
cout << root->date << " ";
InOrderTraversal(root->right);
}
//后序遍历
void OutOrderTraversal(Node* & root)
{
if(root==NULL) return;
OutOrderTraversal(root->left);
OutOrderTraversal(root->right);
cout << root->date << " ";
}
int main()
{
Node* root = Creat_An_BTree();
cout << "层序遍历:";
LevelOrderTraversal(root);
cout<< endl;
cout << "先序遍历:";
PreOrderTraversal(root);
cout << endl;
cout << "中序遍历:";
InOrderTraversal(root);
cout << endl;
cout << "后序遍历:";
OutOrderTraversal(root);
cout << endl;
return 0;
}