主题:这个问题够难大家一阵了?
sageking2
[专家分:200] 发布于 2008-05-24 19:53:00
题目一句话:给定棵二叉树,输出所有叶子到根结的路径和一条最短的?
回复列表 (共7个回复)
沙发
卧龙孔明 [专家分:240] 发布于 2008-05-25 08:31:00
就是一个递归遍历
板凳
sageking2 [专家分:200] 发布于 2008-05-25 09:07:00
谢谢关注!你仔细想想就没这么的容易了.
3 楼
讨厌的蚊子 [专家分:10] 发布于 2008-05-25 11:30:00
遍历同时计数,比较大小即可
4 楼
讨厌的蚊子 [专家分:10] 发布于 2008-05-25 11:31:00
哪位高手提示一下
5 楼
rickone [专家分:15390] 发布于 2008-05-26 13:47:00
楼主什么意思?
树的定义表明树中是没有环路的,所以任意两个结点的连通路径只有一条(真路),何来最短?
6 楼
rickone [专家分:15390] 发布于 2008-05-26 13:50:00
哦,你是指所有叶子中的路啊~~~
1楼说得就可以啦~~
7 楼
sageking2 [专家分:200] 发布于 2008-05-27 20:23:00
搞定了,谢谢各位!
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*/
}
}
}
我来回复