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

C 从数组按级别顺序创建二叉树,c,arrays,algorithm,binary-tree,C,Arrays,Algorithm,Binary Tree,我正在研究一个小算法,它可以按级别顺序构建二叉树。我得到一个数组,我必须使用数组中的值按级别顺序构建一个二叉树。例子: arr-inarr[5]={1,2,3,4,5} 给定这样一个数组,我需要填充一个二叉树,如下所示: 1 / \ 2 3 / \ / \ 4 5 * * (*为空) 这些节点是基本的二进制节点,具有一个左右指针和一个用于保存数组值的int的空格 我理解根据树的高度遍历树的概念,一次遍历一个层次,但我

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

给定这样一个数组,我需要填充一个二叉树,如下所示:

        1
      /   \
    2      3
   / \    / \
  4   5  *   * 
(*为空) 这些节点是基本的二进制节点,具有一个左右指针和一个用于保存数组值的int的空格

我理解根据树的高度遍历树的概念,一次遍历一个层次,但我不确定以这种方式构建树的正确逻辑

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

这种算法将遵循以下原则:

  • 通用树的根位于
    0
  • 队列
    q
    具有要处理的下一个节点
  • 每次我们从队列中提取节点时,它的子节点都位于
    i
    i+1
    位置。请注意,级别遍历保证了这种条件。所以
  • 我们将当前节点的子节点放在队列中
  • 下面的伪代码从包含其by遍历级别的数组中构建树

    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;
    }
    
    Node*根据级别顺序构建(int a[],int n)
    {
    队列q;//这是指向节点的指针队列
    Node*root=(Node*)malloc(sizeof(Node));
    root->key=a[0];root->left=root->right=NULL;
    q、 放(根);
    对于(int i=1;ikey=a[i++];l->left=l->right=NULL;
    p->左=l;
    q、 put(l);
    如果(ikey=a[i++];r->left=r->right=NULL;
    p->right=r;
    q、 put(r);
    }
    }
    返回根;
    }
    
    在O(n)中构建一个空树,如果数组已排序,则可以按顺序遍历它并相应地填充节点。你构建的树是一个完整的二叉树,从右边删除叶子,因此匹配你的数组大小@FireSun的可能重复项我检查了你报告的帖子,发现可能重复项,事实是我没有发现任何关系。你能检查一下吗?如果
    arrinar[5]={3,1,2,4,5},是否会建立同一棵树