设计递归算法,求以“孩子-兄弟链表”表示的度
2013-08-03 19:38
218 查看
最近学习数据结构,用的书籍是陈文博的《数据结构及应用算法教程》,对其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定义为全局变量。而是定义为函数内的局部变量。这样每次调用都会把数据压入到堆栈里面。而全局变量则会在执行的过程中被修改。原来在递归调用中,变量一般应设置为函数局部变量呀。
书本算法如下:
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定义为全局变量。而是定义为函数内的局部变量。这样每次调用都会把数据压入到堆栈里面。而全局变量则会在执行的过程中被修改。原来在递归调用中,变量一般应设置为函数局部变量呀。
相关文章推荐
- 求 以孩子-兄弟链表表示的树 的度、深度、叶结点和边
- 以孩子兄弟链表表示法为存储结构,求树的深度和度。
- 树的孩子链表表示法
- 树的存储:双亲数组法,孩子链表法,孩子兄弟法
- 树的孩子链表表示法
- poj 1192 最优连通子集 树的孩子兄弟表示法+简单树型dp
- 树的孩子表示法,树的兄弟表示法,树的存储结构详解,数据结构-树的学习(2)
- 使用C++ 和 孩子兄弟表示法实现树
- 已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和B的差集(即仅由在A中出现而不在B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。
- 任意有根树的左孩子右兄弟表示法存储
- 将邻接表表示的图转换为孩子兄弟法表示的二叉树
- 孩子兄弟表示法(二叉链表树)
- 一般树的建立(孩子兄弟链表) 、遍历、深度
- 数据结构——二叉树的孩子链表表示法
- 树的孩子兄弟表示法 及遍历实现
- 树的孩子链表表示法可执行代码(创建,层次遍历)
- 树-孩子兄弟表示法的实现
- 构建树(孩子兄弟表示法)
- 森林的双亲孩子表示法的设计与实现
- 数据结构:树--孩子兄弟表示法