从C中的给定整数数组构造一个完整的二叉树

时间:2016-07-21 06:46:53

标签: c queue binary-tree

我在代码中遇到以下问题的意外输出:

从给定的整数数组构造一个完整的(或几乎完整的)二叉树。 使用队列的链表表示。

完整二叉树 完整BT ,所有叶子都在同一级别。 几乎完整的BT 不一定是完整BT ,并且所有叶子都在同一级别。

实施例1:几乎完全BT

arr[]={10,9,-5,1,2}

    Tree:
    10
   /  \
  9   -5
 / \
1   2

实施例2:完成BT

arr[]={10,9,-5,1,2,7,4}

Tree:

    10
   /  \
  9   -5
 / \  /  \
1   2 7   4

代码

#include <stdio.h>
#include <stdlib.h>

typedef struct node_tree
{
    int info;
    struct node_tree *left,*right;
}TREE_NODE;

typedef struct node_queue
{
    TREE_NODE *tn;
    struct node_queue *next;
}QUEUE_NODE;

TREE_NODE *newTN(int info)
{
    TREE_NODE *newN=(TREE_NODE*)malloc(sizeof(TREE_NODE));
    newN->left=newN->right=0;
    newN->info=info;
    return newN;
}

void push_queueN(QUEUE_NODE **pf,QUEUE_NODE **pr,TREE_NODE *tn)
{
    QUEUE_NODE *newQN=(QUEUE_NODE*)malloc(sizeof(QUEUE_NODE));
    newQN->tn=tn;
    newQN->next=0;
    if(*pf==0)
      *pf=*pr=newQN;
    else
    {
        (*pr)->next=newQN;
        *pr=newQN;
    }
}

int pop_queueN(QUEUE_NODE **pf,QUEUE_NODE **pr,TREE_NODE **tn)
{
    if(*pf==0)
        return 0;
    QUEUE_NODE *p=*pf;
    *tn=p->tn;
    if(*pf==*pr)
        *pf=*pr=0;
    else
        *pf=p->next;
    free(p);
    return 1;
}

TREE_NODE *complete(int *arr,int n)
{
    TREE_NODE *root;
    QUEUE_NODE *pf=0,*pr=0;
    int check=0,i;
    int *p=arr;

    if(p==NULL)
        root=NULL;

    root=newTN(arr[0]);
    push_queueN(&pf,&pr,root);

    p++;
    for(i=0;i<n;i++)
    {

       TREE_NODE *parent=pf->tn;
       if(pop_queueN(&pf,&pr,&parent))
            check=1;
       else
            check=0;
       TREE_NODE *leftChild=NULL,*rightChild=NULL;
       leftChild=newTN(&p);
       push_queueN(&pf,&pr,leftChild);
       p++;
       if(p)
       {
         rightChild=newTN(&p);
         push_queueN(&pf,&pr,rightChild);
         p++;
       }

       parent->left=leftChild;
       parent->right=rightChild;
    }

    return root;
}

int height(TREE_NODE *root)
{
    if(root==0)
        return 0;
    int hl=height(root->left);
    int hr=height(root->right);

    return 1+(hl>hr?hl:hr);
}

void printCurrLevel(TREE_NODE *root,int level)
{
   if(root==0)
        return;
   if(level==1)
        printf("%d",root->info);
   else if(level>1)
   {
      printCurrLevel(root->left,level-1);
      printCurrLevel(root->right,level-1);
   }
}

void levelOrder(TREE_NODE *root)
{
   int h=height(root),i;

   for(i=1;i<=h;i++)
      printCurrLevel(root,i);

}

int main()
{
    int arr[]={10,9,-5,1,2};
    int n=sizeof(arr)/sizeof(arr[0]);
    TREE_NODE *root;
    root=complete(arr,n);
    levelOrder(root);

    return 0;
}

函数complete()中的指针存在一些问题。

有人可以指出可能的错误在哪里吗?

0 个答案:

没有答案