第一种:层次型递归:
树结点的左子树和右子树是按顺序递归的
例题:求解树的叶子结点数;树的前序、中序、后序递归方法(n叉树可以对应写出代码)
void func(node* root)
{
//添加对root的具体操作(可与下面代码交换位置)
func(root->left);
func(root->right);
}
第二种:并列型递归(非常漂亮的代码)
树结点的左子树和右子树的递归有“求和”、“或者”等关系
例题:求树总的结点数目、路径总和
int func(node* root)
{
return func(root->left)+func(root->right)+1; //求树的总结点数
return func(root->left)||func(root->right); //求根到叶子路径和形式
}
第三种:有反馈型递归
树结点的左子树和右子树不仅有关系,而且还是有反馈形式的,更复杂。
例题:求树的最大深度、最小深度;求二叉搜索树的公共祖先结点;求二叉树的公共祖先结点
node* func(node* root)
{
node* left=func(root->left);
node* right=func(root->right);
//此处添加left和right的具体操作形式
}