给定一个节点列表及其拥有的子节点数,从该列表构建一个(非二进制)树(在预先遍历遍历中)
例如,我得到以下内容:
1 3
2 1
3 0
4 0
5 0
这是一棵看起来像
的树 1
/|\
/ | \
2 4 5
/
3
我知道我应该使用递归来构造这个树,但是因为它不是二叉树,所以我很遗憾应该如何实现这个算法。
答案 0 :(得分:3)
在为您提供解决问题的代码之前,我想和您一起玩思想游戏。请看下面的图像,该图像表示递归应如何为您的输入展开
研究图像并注意如何仅在特定节点存在子节点时才开始递归(并且它们最后是输入中指示的子节点数)。
尝试在纸上提出代码(或伪代码)。
解决此问题的代码非常简单:使用vector<Node>
存储您的孩子
#include <iostream>
#include <vector>
using namespace std;
struct Node {
Node(int v) : val(v) {}
int val;
vector<Node*> children;
};
Node *readTreeNode() {
int val, children;
cin >> val >> children;
Node *node = new Node(val);
for (int i = 0; i<children; ++i)
node->children.push_back(readTreeNode());
return node;
}
int main() {
Node *root = readTreeNode();
// Do the cleanup..
return 0;
}
注意递归调用readTreeNode()
函数的循环
for (int i = 0; i<children; ++i)
node->children.push_back(readTreeNode());
内在的孩子先于其他孩子处理。
最后的警告:
我没有实现内存处理(上面的代码泄漏了内存)。做一个好公民,释放你分配的内存,或者更好的是,使用智能指针。
没有错误处理(即没有有效输入输入节点的检查)