C++实现记录二叉树的所有路径
1. 二叉树的实现
struct TreeNode {
TreeNode() : m_val(0), m_left_node(NULL), m_right_node(NULL) { }
TreeNode(int val) : m_val(val), m_left_node(NULL), m_right_node(NULL) { }
TreeNode(int val, TreeNode* left_node, TreeNode* right_node) : m_val(val), m_left_node(left_node), m_right_node(right_node) { }
int m_val;
TreeNode* m_left_node;
TreeNode* m_right_node;
};
2. 获取路径代码
void GetPath(TreeNode* root, std::vector<TreeNode*>& path, std::vector<std::string>& res) {
if (!root->m_left_node && !root->m_right_node) {
path.push_back(root);
std::string tmp;
for (int i = 0; i < path.size() - 1; ++i) {
tmp += std::to_string(path[i]->m_val);
tmp += "->";
}
tmp += std::to_string(path[path.size() - 1]->m_val);
res.push_back(tmp);
return;
}
path.push_back(root);
if (root->m_left_node) {
GetPath(root->m_left_node, path, res);
path.pop_back();
}
if (root->m_right_node) {
GetPath(root->m_right_node, path, res);
path.pop_back();
}
}
3. 整体代码
#include <iostream>
#include <vector>
#include <string>
struct TreeNode {
TreeNode() : m_val(0), m_left_node(NULL), m_right_node(NULL) { }
TreeNode(int val) : m_val(val), m_left_node(NULL), m_right_node(NULL) { }
TreeNode(int val, TreeNode* left_node, TreeNode* right_node) : m_val(val), m_left_node(left_node), m_right_node(right_node) { }
int m_val;
TreeNode* m_left_node;
TreeNode* m_right_node;
};
class Solution {
public:
std::vector<std::string> Plan(TreeNode* root) {
std::vector<TreeNode*> path;
std::vector<std::string> res;
GetPath(root, path, res);
return res;
}
void GetPath(TreeNode* root, std::vector<TreeNode*>& path, std::vector<std::string>& res) {
if (!root->m_left_node && !root->m_right_node) {
path.push_back(root);
std::string tmp;
for (int i = 0; i < path.size() - 1; ++i) {
tmp += std::to_string(path[i]->m_val);
tmp += "->";
}
tmp += std::to_string(path[path.size() - 1]->m_val);
res.push_back(tmp);
return;
}
path.push_back(root);
if (root->m_left_node) {
GetPath(root->m_left_node, path, res);
path.pop_back();
}
if (root->m_right_node) {
GetPath(root->m_right_node, path, res);
path.pop_back();
}
}
void FreeSpace(TreeNode* root) {
if (!root) return;
if (root->m_left_node) FreeSpace(root->m_left_node);
if (root->m_right_node) FreeSpace(root->m_right_node);
delete root;
}
};
int main() {
TreeNode* root = new TreeNode(5, new TreeNode(6, new TreeNode(8), new TreeNode(9)), new TreeNode(7, NULL, NULL));
Solution solution;
std::vector<std::string> res = solution.Plan(root);
for (int i = 0; i < res.size(); ++i) std::cout << res[i] << std::endl;
solution.FreeSpace(root);
return 0;
}