题面:
![](https://i-blog.csdnimg.cn/blog_migrate/07f4b69d8af6138c7a8a1b71abb3115f.png)
解题:
前序遍历:
简单来说就是根节点的访问顺序,即根->左->右。
同理,后序即左右根,中序即左根右(大佬可自觉跳过本段废话)
创建一个“Tree”类,其属性有名字、左、右节点。
class Tree //树类
{
public:
char name;
char left, right;
};
用一个容器vector<Tree>存放所有树类,创建一个函数getTree(),
用于根据输入的名字找到匹配名字的树
Tree getTree(char c) //根据名字查找节点
{
for (vector<Tree>::iterator it = v.begin(); it != v.end(); it++)
if (it->name == c)return *it;
return Tree(); //未找到,返回空树(该情况不会发生)
}
从主节点开始,向下递归搜索的函数dfs(Tree root),详见下代码:
AC代码奉上
#include<iostream>
#include<vector>
using namespace std;
class Tree //树类
{
public:
char name;
char left, right;
};
vector<Tree>v;
int n;
Tree getTree(char c) //根据名字查找节点
{
for (vector<Tree>::iterator it = v.begin(); it != v.end(); it++)
if (it->name == c)return *it;
return Tree(); //未找到,返回空树
}
void dfs(Tree root)
{
cout << root.name;
if (root.left != '*')
dfs(getTree(root.left));
if (root.right != '*')
dfs(getTree(root.right));
}
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
Tree t;
cin >> t.name >> t.left >> t.right;
v.push_back(t);
}
dfs(v[0]);
return 0;
}