知识点
重点: 讲解二叉树的遍历方式以及代码实现,遍历二叉树方式主要分为两大类,深度优先搜索和广度优先搜索,其中深搜有递归法和迭代法,广搜有迭代法。
代码实现:
#include <iostream>
#include <string>
#include <vector>
#include <stack>
#include <algorithm>
using namespace std;
// 二叉树
struct TreeNode {
int value; // 节点值
TreeNode* left; // 左孩子
TreeNode* right; // 右孩子
TreeNode(int x) :value(x), left(nullptr), right(nullptr) {} //初始化
};
// 递归(先序)
void preorderTrace(TreeNode* root, vector<int>& res) {
if (root == nullptr) { // 终止条件
return;
}
res.push_back(root->value); // 根
preorderTrace(root->left, res); // 左
preorderTrace(root->right, res); // 右
}
// 迭代(先序)
void IterorderTrace(TreeNode* root, vector<int>& res) {
stack<TreeNode*> st;
st.push(root);
while (!st.empty()) {
TreeNode* temp = st.top();
res.push_back(temp->value);
st.pop();
if (temp->right != nullptr) {
st.push(temp->right); // 右孩子
}
if (temp->left != nullptr) {
st.push(temp->left); // 左孩子
}
}
}
// 迭代(后序)
void IterendTrace(TreeNode* root, vector<int>& res) {
stack<TreeNode*> st;
st.push(root);
while (!st.empty()) {
TreeNode* temp = st.top();
res.push_back(temp->value);
st.pop();
if (temp->left != nullptr) {
st.push(temp->left); // 左孩子
}
if (temp->right != nullptr) {
st.push(temp->right); // 右孩子
}
}
reverse(res.begin(), res.end());
}
// 迭代(中序)
void IteriteTrace(TreeNode* root, vector<int>& res) {
stack<TreeNode*> st;
TreeNode* node = root; // 跟随指针
while (node != nullptr || !st.empty()) {
if (node != nullptr) {
st.push(node);
node = node->left;
}
else {
node = st.top();
st.pop();
res.push_back(node->value);
node = node->right;
}
}
}
int main(int argc, char* argv[]) {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
TreeNode* root_1 = new TreeNode(1);
TreeNode* root_2 = new TreeNode(2);
TreeNode* root_3 = new TreeNode(3);
TreeNode* root_4 = new TreeNode(4);
TreeNode* root_5 = new TreeNode(5);
TreeNode* root_6 = new TreeNode(6);
TreeNode* root_7 = new TreeNode(7);
root_1->left = root_2;
root_1->right = root_3;
root_2->left = root_4;
root_2->right = root_5;
root_3->left = root_6;
root_3->right = root_7;
vector<int> res;
preorderTrace(root_1, res);
vector<int> res2;
IterorderTrace(root_1, res2);
vector<int> res3;
IterendTrace(root_1, res3);
vector<int> res4;
IteriteTrace(root_1, res4);
cout << "递归遍历(先序):" << endl;
for (auto val : res) {
cout << val << " ";
}
cout << endl;
cout << "-----------------" << endl;
cout << "迭代遍历(先序):" << endl;
for (auto val2 : res2) {
cout << val2 << " ";
}
cout << endl;
cout << "-----------------" << endl;
cout << "迭代遍历(后序):" << endl;
for (auto val3 : res3) {
cout << val3 << " ";
}
cout << endl;
cout << "-----------------" << endl;
cout << "迭代遍历(中序):" << endl;
for (auto val4 : res4) {
cout << val4 << " ";
}
cout << endl;
system("pause");
return 0;
}