【问题标题】:Create binary tree in level order from array从数组按级别顺序创建二叉树
【发布时间】:2016-02-24 11:19:45
【问题描述】:

我正在研究一种按级别顺序构建二叉树的小算法。我得到一个数组,我必须使用其中的值按级别顺序构建二叉树。例子: arr inarr[5]={1,2,3,4,5};

给定一个这样的数组,我需要填充一个二叉树,看起来像这样:

        1
      /   \
    2      3
   / \    / \
  4   5  *   * 

(* 为 NULL) 这些节点是基本的二进制节点,带有一个左右指针和一个用于保存数组值的 int 的空间。

我了解基于树的高度遍历树的概念,并且您一次通过它一层,但我不确定以这种方式正确构建它的正确逻辑。

【问题讨论】:

  • 在 O(n) 中构建一棵空树,如果您的数组已排序,那么您可以按顺序遍历它并相应地填充节点。你构建的树是一个完整的二叉树,从右边删除叶子,所以匹配你的数组大小
  • @FireSun 我检查了您报告的可能重复的帖子,事实是我没有发现任何关系。你能查一下吗?
  • 如果arr inarr[5]={3,1,2,4,5};,会构建相同的树吗?

标签: c arrays algorithm binary-tree


【解决方案1】:

按级别遍历树的“自然”方式是使用队列。因此,直观地说,逆向算法可以使用队列来记忆下一个要处理的节点。

这样的算法将遵循以下原则:

  1. 一般树的根在0的位置
  2. 队列q 有下一个要处理的节点
  3. 每次我们看到一个节点,通过从队列中提取,它的子节点位于ii+1 的位置。请注意,级别遍历保证了这种情况。所以
  4. 我们将当前节点的子节点放入队列中

以下伪代码从包含其逐层遍历的数组构建树

Node * build_from_level_order(int a[], int n)
{
  Queue q; // this is a queue of pointers to nodes

  Node * root = (Node*) malloc(sizeof(Node));
  root->key = a[0]; root->left = root->right = NULL;
  q.put(root);

  for (int i = 1; i < n; /* advancing of i is inside */)
    {
      Node * p = q.get();

      Node * l = (Node*) malloc(sizeof(Node));
      l->key = a[i++]; l->left = l->right = NULL;

      p->left = l;
      q.put(l);

      if (i < n) // last level could end in a left node, this test prevents to see an inexistent right node
        {
          Node * r = (Node*) malloc(sizeof(Node));
          r->key = a[i++]; r->left = r->right = NULL;
          p->right = r;
          q.put(r);
        }
    }

  return root;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-27
    • 2017-08-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多