前言:这几个操作本质还是递归,所以理解递归尤为重要!
一、求层数
int GetLayerNum(BiTree root)
{
if(root==NULL)
{
return 0;
}
int left=GetLayerNum(root->left);
int right=GetLayerNum(root->right);
if(left>right)
{
return left+1;
}else{
return right+1;
}
}
二、求解点数
int GetBiTreeNodeNum(BiTree root)
{
if(root==NULL)
{
return 0;
}else{
return GetBiTreeNodeNum(root->left)+GetBiTreeNodeNum(root->right)+1;
}
}
三、求度为0的节点个数
int GetDegreeIsZeroNodeNum(BiTree root)
{
if(root==NULL)
{
return 0;
}else if(root->left==NULL && root->right==NULL){
return 1;
}else{
return GetDegreeIsZeroNodeNum(root->left)+GetDegreeIsZeroNodeNum(root->right);
}
}
四:复制二叉树
可以先来看下这个代码,这个代码是可以运行的,但是拷贝之后没有任何结果,当传进实参时(root2传进来为空值),函数形成形参指向root2.root2=(BiTree)malloc(sizeof(BiNode));,这句话,相当是修改了形参的地址,而不是修改此指针指向的值。所以函数执行完root2还是空。
void CopyBiTree(BiTree root1,BiTree root2)
{
if(root1==NULL)
{
root2=NULL;
}else{
root2=(BiTree)malloc(sizeof(BiNode));
root2->data=root1->data;
CopyBiTree(root1->left,root2->left);
CopyBiTree(root1->right,root2->right);
}
}
提供两种方法。
void CopyBiTree(BiTree root1,BiTree *root2)
{
if(root1==NULL)
{
*root2=NULL;
}else{
*root2=(BiTree)malloc(sizeof(BiNode));
(*root2)->data=root1->data;
CopyBiTree(root1->left,&((*root2)->left));
CopyBiTree(root1->right,&((*root2)->right));
}
}
BiTree CopyBiTree2(BiTree root1)
{
BiTree root2;
if(root1==NULL)
{
root2=NULL;
}else{
root2=(BiTree)malloc(sizeof(BiNode));
root2->data=root1->data;
root2->left=CopyBiTree2(root1->left);
root2->right=CopyBiTree2(root1->right);
}
return root2;
}