前序遍历:
规定访问次序,根节点→左节点→右节点我们可以发现每次访问完一个根节点之后,我们都必须要通过递归的方式访问它的左右节点,直到访问到叶子节点结束,由此可以得出这里递归的结束条件是左右节点均为空
/*tree为结构体struct tree
struct tree: int val,struct tree* left,struct tree* right*/
void PrevOrder(tree* root)
{
if(root==NULL)
return;
printf("%d ",root->val);
PrevOrder(root->left);
PrevOrder(root->right);
}//由于遍历操作较为简单,这里不画出递归展开图演示
中序遍历、后序遍历:
中序: 左节点→根节点→右节点
后序: 左节点→右节点→根节点
原理相同,代码片简要展示
void InOrder(tree* root)//中序
{
if(root==NULL)
return;
InOrder(root->left);//一直递归到最左边
printf("%d ",root->val);
InOrder(root->right);
}
void PostOrder(tree* root)//后序
{
if(root==NULL)
return;
PostOrder(root->left);
PostOrder(root->right);
printf("%d ",root->val);
}
统计总节点数:
分析:
节点总数=1(根节点)+左子树总节点+右子树总节点
简单来说,如果我们要统计节点总数,就是 第一层的节点数,第一层左子树节点数,第一层右子树节点数三者之和,每一个左右子树又可以视为一个单独的二叉树按照同样的公式计算出总节点数
由此我们可以退出递推表达式:
int treesize(tree* root)
{
if(root==NULL)
return 0;//当访问到叶子节点时需要返回
return treesize(root->left)+
treesize(root->right)+1;
}
部分递归展开图:
统计叶子节点个数:
从根节点出发开始递归,当遇到左右节点均为空的即为叶子节点,计数1
int leafsize(tree* root)
{
if(root==NULL)
return 0;
if(root->left==NULL&&root->right==NULL)
return 1;
return leafsize(root->left)+leafsize(root->right);
}
第K层节点数:
int levelsize(tree* root,int k)
{
if(root==NULL)
return 0;
if(k==1)
return 1;
return levelsize(root->left,k-1)+levelsize(root->right,k-1);
}
文章结束,喜欢的话可以留个赞,关注一下嘛?蟹蟹。