从数组中按级别顺序创建二叉树

时间:2015-11-22 07:32:07

标签: c arrays algorithm binary-tree

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

给定这样的数组我需要填写二进制树,如下所示:

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

(*为NULL) 节点是具有左右指针的基本二进制节点,以及用于保存数组值的int的空间。

我理解基于它的高度遍历树的概念,你一次只能在一个层次上移动它,但我不确定正确构建它的正确逻辑。

1 个答案:

答案 0 :(得分:0)

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

这种算法可以使用以下原则:

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

    的数组构建树
    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;
    }