回 帖 发 新 帖 刷新版面

主题:这个问题够难大家一阵了?

题目一句话:给定棵二叉树,输出所有叶子到根结的路径和一条最短的? 

回复列表 (共7个回复)

沙发

就是一个递归遍历

板凳

谢谢关注!你仔细想想就没这么的容易了.

3 楼

遍历同时计数,比较大小即可

4 楼

哪位高手提示一下

5 楼

楼主什么意思?

树的定义表明树中是没有环路的,所以任意两个结点的连通路径只有一条(真路),何来最短?

6 楼

哦,你是指所有叶子中的路啊~~~

1楼说得就可以啦~~

7 楼

搞定了,谢谢各位!
void LongPath(BTNode *b)
{/*用队道输出一条最长路径*/
    struct snode
    {
        BTNode *node;       /*存放当前结点指针*/
        int parent;         /*存放双亲结点在队列中的位置*/
    }qu[15];                /*定义非环形队列*/
    BTNode *q;
    int front,rear,p;       /*定义队头和队尾指针*/
    front=rear=-1;          /*置队列为空队列*/
    rear++;
    qu[rear].node=b;        /*根结点指针进入队列*/
    qu[rear].parent=-1;     /*根结点没有双亲结点*/
    while(front<rear)       /*队列不为空*/
    {
        front++;            /*front是当前结点*q在qu中的位置*/
        q=qu[front].node;   /*队头出队列,该结点指针仍在qu中*/
        if(q->lchild==NULL && q->rchild==NULL && front==rear)/*q为叶子结点,加个front=rear判断最长叶子*/
        {
            p=front;        /*输出*q到根结点的路径序列*/
            while(qu[p].parent!=-1)
            {
                printf("%c->",qu[p].node->data);
                p=qu[p].parent;
            }
            printf("%c\n",qu[p].node->data);
        }
        if(q->lchild!=NULL) /**q结点有左孩子时将其进列*/
        {
            rear++;
            qu[rear].node=q->lchild;
            qu[rear].parent=front;/**q的左孩子的双亲位置为front*/
        }
        if(q->rchild!=NULL)/**q结点有右孩子时将其进列*/
        {
            rear++;
            qu[rear].node=q->rchild;
            qu[rear].parent=front;/**q的右孩子的双亲位置为front*/
        }
    }
}

我来回复

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