最近学习数据结构,用的书籍是陈文博的《数据结构及应用算法教程》,对其194页的关于树的算法甚是不解。为了理解,折腾了大于一天半,但是还是不行。
书本算法如下:
int degreeOfTree(CSTree T)
{
CSTree p;
int degree;
int d;
if(!T->firstchild)
return 0;
else
{
for(degree=0;p=T->firstchild;p;p=p->nextsibling)
degree++;
for(p=T->firstchild;p;p=p->nextsibling)
{
d=degreeOfTree(p);
if(d>degree)
degree=d;
}
return degree;
}
}
我发现,如果一个结点的firstchild==NULL时,其返回为0.如果设C为一个子根节点,该根节点有4个孩子。分别为F G H I,则程序循序执行。之前计算的C节点的度4,被之后的其孩子中的最后一个度数不为0的给覆盖了。即degree的值,会被覆盖。
问题终于解决了,程序本身没有错误,是我定义变量的位置不对,不应该把degree和d定义为全局变量。而是定义为函数内的局部变量。这样每次调用都会把数据压入到堆栈里面。而全局变量则会在执行的过程中被修改。原来在递归调用中,变量一般应设置为函数局部变量呀。