如何填充非线性树

时间:2013-11-15 16:31:45

标签: c++ algorithm tree binary-tree

如何使用以下结构填充树 enter image description here

数据“A,B,C,D,E,F,G,H,I,J”所以在人口之后它的结构看起来像那样

enter image description here

我可以使用递归和函数轻松完成它,但我被告知我不能使用函数,只能循环。

这是我正在使用的结构

struct Tree
{
    int value;
    Tree* left;
    Tree* right;
};

2 个答案:

答案 0 :(得分:3)

这可以通过队列来完成。

对于输入中的每个元素:

  • 将其添加到队列中。
  • 然后将其添加到最后一个节点,作为左子节点,或者如果已有左子节点则将其添加到右子节点。
  • 如果现在已经填充了最后一个节点的两个子节点,请将最后一个节点作为队列中出队的项目。

在伪代码中:

list = A,B,C,D,E,F,G,H,I,J

last = list.removeFront()

while !list.empty
  node = list.removeFront()
  queue.enqueue(node)
  if last.left == NULL
    last.left = node
  else
    last.right = node
    last = queue.dequeue()

答案 1 :(得分:1)

这是关于构建完整的二叉树。我们可以使用数组来存储节点,关键是找到父节点。

struct Tree
{
    int val;
    Tree *left, *right;
    Tree():val(0), left(NULL), right(NULL){}
};

Tree* buildCompleteBinaryTree(const vector<int>& values)
{
    size_t len = values.size();
    if(len <= 0) return NULL;

    Tree* trees = new Tree[len];
    trees[0].val = values[0];
    for(size_t i = 1; i < len; i++)
    {
        trees[i].val = values[i];
        size_t par = (i - 1) / 2;
        (i % 2)?(trees[par].left = &(trees[i])):(trees[par].right = &(trees[i]));
    }

    return trees;
}