主题:关于求二叉树深度的非递归算法~请教~
我的想法是,先遍历二叉树,找出所有叶子结点,并把叶子结点的地址以线性表的形式存储起来,然后通过结点的指向双亲的指针,往回找,直到找到根结点为止,其间对回找的过程计数,取其中最大的一次计数为该数深度~但不知为什么,在找结点的时候,只能把最右的结点地址存储起来,其他的并没有连入线性表中,导致深度的求解出错~请大家帮忙看看是哪里有问题~谢谢~
void locate_leaves(bitree p,struct leaves_address *l)
{
struct leaves_address *temp;
if (p!=NULL)
{
if ((p->left==NULL)&&(p->right==NULL))
{
temp=(struct leaves_address *)malloc(sizeof(struct leaves_address));
temp->f=p;
l->next=temp;
l=l->next;
l->next=NULL;
}
if (p->left!=NULL) locate_leaves(p->left,l);
if (p->right!=NULL) locate_leaves(p->right,l);
}
}
int depth(bitree p)
{
struct leaves_address head;
struct node *q;
struct leaves_address *l;
leaves_address_linklist_initial(&head);
l=&head;
locate_leaves(p,l);
l=&head;
l=l->next;
while(l!=NULL)
{
q=l->f;
while(q!=NULL)
{
temp++;
q=q->parent;
}
if (temp>dep) dep=temp;
l=l->next;
}
return(dep);
}
注:存储叶子地址的线性表有头结点
void locate_leaves(bitree p,struct leaves_address *l)
{
struct leaves_address *temp;
if (p!=NULL)
{
if ((p->left==NULL)&&(p->right==NULL))
{
temp=(struct leaves_address *)malloc(sizeof(struct leaves_address));
temp->f=p;
l->next=temp;
l=l->next;
l->next=NULL;
}
if (p->left!=NULL) locate_leaves(p->left,l);
if (p->right!=NULL) locate_leaves(p->right,l);
}
}
int depth(bitree p)
{
struct leaves_address head;
struct node *q;
struct leaves_address *l;
leaves_address_linklist_initial(&head);
l=&head;
locate_leaves(p,l);
l=&head;
l=l->next;
while(l!=NULL)
{
q=l->f;
while(q!=NULL)
{
temp++;
q=q->parent;
}
if (temp>dep) dep=temp;
l=l->next;
}
return(dep);
}
注:存储叶子地址的线性表有头结点