从预订遍历构造非二叉树

时间:2015-10-09 19:53:29

标签: c++ tree

给定一个节点列表及其拥有的子节点数,从该列表构建一个(非二进制)树(在预先遍历遍历中)

例如,我得到以下内容:

1 3
2 1
3 0
4 0
5 0

这是一棵看起来像

的树
           1
          /|\
         / | \
        2  4  5
       /
      3

我知道我应该使用递归来构造这个树,但是因为它不是二叉树,所以我很遗憾应该如何实现这个算法。

1 个答案:

答案 0 :(得分:3)

在为您提供解决问题的代码之前,我想和您一起玩思想游戏。请看下面的图像,该图像表示递归应如何为您的输入展开

enter image description here

研究图像并注意如何仅在特定节点存在子节点时才开始递归(并且它们最后是输入中指示的子节点数)。

尝试在纸上提出代码(或伪代码)。

解决此问题的代码非常简单:使用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;
}

Live Example

注意递归调用readTreeNode()函数的循环

for (int i = 0; i<children; ++i)
    node->children.push_back(readTreeNode());

内在的孩子先于其他孩子处理。

最后的警告:

  1. 我没有实现内存处理(上面的代码泄漏了内存)。做一个好公民,释放你分配的内存,或者更好的是,使用智能指针。

  2. 没有错误处理(即没有有效输入输入节点的检查)

相关问题