我在代码中遇到以下问题的意外输出:
从给定的整数数组构造一个完整的(或几乎完整的)二叉树。 使用队列的链表表示。
完整二叉树 完整BT ,所有叶子都在同一级别。 几乎完整的BT 不一定是完整BT ,并且所有叶子都在同一级别。
arr[]={10,9,-5,1,2}
Tree:
10
/ \
9 -5
/ \
1 2
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()
中的指针存在一些问题。
有人可以指出可能的错误在哪里吗?