回 帖 发 新 帖 刷新版面

主题:关于求二叉树深度的非递归算法~请教~

我的想法是,先遍历二叉树,找出所有叶子结点,并把叶子结点的地址以线性表的形式存储起来,然后通过结点的指向双亲的指针,往回找,直到找到根结点为止,其间对回找的过程计数,取其中最大的一次计数为该数深度~但不知为什么,在找结点的时候,只能把最右的结点地址存储起来,其他的并没有连入线性表中,导致深度的求解出错~请大家帮忙看看是哪里有问题~谢谢~

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);
}

注:存储叶子地址的线性表有头结点

回复列表 (共3个回复)

沙发

你连结构体的定义都不给,真是难为大家啊。我只能猜猜看了。
l->next=temp;
l=l->next;
l->next=NULL;
从这几句看你是想头插法加入单链表吧,应该改为:
temp->next=l->next;
l->next=temp;

板凳


[em18]是不是太复杂了呢。。。。

3 楼

int height(BTNODE *t)
{
   if(!t)
   {
      return 0;
   }
   int left_height = height(t->left_child);
   int right_height = height(t->right_child);
   return (left_height > right_height ? left_height+1:right_height+1);
}

我来回复

您尚未登录,请登录后再回复。点此登录或注册