今天覆习了二叉树的链式存储结构,又发现了之前忽略的一些细节问题,现在总结整理如下
问题一:
在字符串赋值函数中,未将全局变量初始化造成错误,说明对全局变量理解不够深入,错误代码及改正如下:
Status StringAssign(String S,char * chars){
int index=1;/*2016-05-11 惊奇的发现这句很重要,找了半天才发现这个错误*/
if(strlen(chars)>MAXSIZE)
return ERROR;
else{
S[0]=strlen(chars);
for(index=1;index<=S[0];index++)
S[index]=*(chars+index-1);
}
}
问题二:在用递归求二叉树深度时,写完if(T->Lchild)之后,没有写else的情况,导致程序出错,说明对递归的理解还不够,还需要多加练习,改正如下:
Status DepthBiTree(BiTree T){
int left=0,right=0;
if(!T)
return 0;
else{
if(T->Lchild)
left=DepthBiTree(T->Lchild);
else
left=0;
if(T->Rchild)
right=DepthBiTree(T->Rchild);
else
right=0;
}
return left>right? left+1:right+1;/*结尾一定要加判断*/
}
下面记录部分习题:
Q1:给定二叉树T,计算其全部节点个数
A:对于计算二叉树中个数的问题,优先考虑递归,本题代码如下:
Status NodesNum(BiTree T){
if(!T)/*树为空时返回0*/
return 0;
else{
return (NodesNum(T->Lchild)+NodesNum(T->Rchild)+1);/*不为空时返回左子树节点数+右子树节点个数+根节点*/
}
}
Q2:给定二叉树T,打印其全部叶子节点
A:常规方法当然是判断二叉树每个节点是否是叶子节点,是则打印,不是则继续向后判断。较为复杂,但是用递归则可以轻松地解决,代码如下:
Status PrintLeaves(BiTree T){
if(!T)/*空树*/
return ERROR;
else{
if(!T->Lchild&&!T->Rchild)/*没有左右子树,即为叶子节点,下一步操作是打印*/
Visit(T->data);
else/*有左右子树,则打印其左右子树的叶子节点*/
PrintLeaves(T->Lchild);
PrintLeaves(T->Rchild);
}
}
Q3:给定二叉树T,求其叶子节点个数
A:依然使用递归,声明两个变量NumL,NumR,代表左右子树的叶子节点个数,代码如下:
int numL,numR;
if(!T)/*空树返回0*/
return 0;
else{/*不为空*/
/*如果没有左右子树,则是叶子节点,返回1*/
if(!T->Lchild&&!T->Rchild)
return 1;
/*不是左右子树,则计算其左右子树的叶子节点个数并赋值给numL,numR,之后返回两变量之和*/
else{
numL=LeaveNum(T->Lchild);
numR=LeaveNum(T->Rchild);
return (numL+numR);
}
}
}
递归是解决二叉树相关问题中常见的方法,要多加练习,以便能够熟练应用.
2015-05-11
于教学实验综合楼