最近正在学《C Primer Plus》,对于书中第十七章的二叉查找树部分的递归调用有些困惑,在查找了相关解释后,总算是明白了一点,和大家分享一下吧
首先,附上书中的部分代码:
//函数调用语句为:InOrder(ptree -> root, pfun)
//即最先传入函数的是指向树根节点的指针,而函数指针pfun指向的是printitem函数
static void InOrder(const Trnode * root, void (*pfun) (Item item))
{
if(root != NULL)
{
InOrder(root -> left, pfun);
(*pfun)(root -> item);
InOrder(root -> right, pfun);
}
}
void printitem(Item item)
{
printf("Pet: %-19s Kind: %-19s\n", item.petname, item.petkind);
}
先解释一下上面代码中的一些表示符的含义:
在解释此段代码之前,我们先假设有如下所示一个二叉树:
现在我们再看代码:
static void InOrder(const Trnode * root, void (*pfun) (Item item))
{
if(root != NULL)
{
InOrder(root -> left, pfun);//递归1
(*pfun)(root -> item);
InOrder(root -> right, pfun);//递归2
}
}
首先root指向的是树根节点,即E节点,递归1递进一次,root指向根节点的左子节点,即B节点;
条件判断为真,递归1再递进一次,root指向B节点的左子节点,即A节点;
此时A节点后无子节点,root -> left == NULL,条件判断为假,递归1回归,root指向A节点,执行递归1后面的语句;
函数指针pfun打印A节点的信息,递归2递进,root -> right == NULL,条件判断为假,递归2回归,root指向A节点,递归1回归,root指向B节点,函数指针pfun打印B节点的信息;
递归2递进一次,root指向B节点的右子节点,即D节点,再递进一次,root -> right == NULL,条件判断为假,递归2回归,root指向D节点,执行递归1,root指向D节点的左子节点,即C节点,C节点后无子节点,执行递归1后面的语句,打印C节点的信息;
递归1回归,root指向D节点,打印D节点的信息,递归2回归,root指向B节点,递归1回归,root指向E节点,打印E节点的信息,至此左子树遍历完;
右子树的遍历参照上面的过程,不同的是root指向的节点顺序为E -> H -> F -> G -> F -> H -> I -> H -> E,而只有在递归1回归的过程中才能打印节点信息,所以打印节点信息的顺序为F -> G -> H -> I
我们可以根据上述过程绘制一个流程图:
以上就是关于二叉树中的递归调用,如果文中有错误,还请指正,谢谢!