1. 前言
本算法系列会给大家讲解一系列常见的算法,本节主要讲解二叉树的先根、中根、后根遍历, 并附上C++算法源码,方便大家面试时参考
本节将以以下这个经典二叉树
为例为大家讲解其遍历方法
定义二叉树节点
struct TreeNode {
char val;
TreeNode *left;
TreeNode *right;
TreeNode(const char &_name) : val(_name), left(nullptr), right(nullptr) {}
};
2. 先根遍历
先根遍历:先访问根节点,再访问左节点,最后访问右节点
则输出为:ABCDEFGH
算法实现:
const std::string preRootTraversal(TreeNode *root) {
if (root == nullptr) {
return "";
}
std::stringstream ss;
ss << root->val;
if (root->left) {
ss << preRootTraversal(root->left);
}
if (root->right) {
ss << preRootTraversal(root->right);
}
return ss.str();
}
3. 中根遍历
结果:CBEDFAGH
原理:先遍历左子树,再遍历根节点,最后遍历右子树;
const std::string midRootTraversal(TreeNode *root) {
if (root == nullptr) {
return "";
}
std::stringstream ss;
if (root->left) {
ss << midRootTraversal(root->left);
}
ss << root->val;
if (root->right) {
ss << midRootTraversal(root->right);
}
return ss.str();
}
4. 后根遍历
结果:CEFDBHGA
原理:遍历左子树,再遍历右子树,最后遍历根节点;
const std::string lastRootTraversal(TreeNode *root) {
if (root == nullptr) {
return "";
}
std::stringstream ss;
if (root->left) {
ss << lastRootTraversal(root->left);
}
if (root->right) {
ss << lastRootTraversal(root->right);
}
ss << root->val;
return ss.str();
}