二叉树复习以及部分常见习题

今天覆习了二叉树的链式存储结构,又发现了之前忽略的一些细节问题,现在总结整理如下

问题一:
在字符串赋值函数中,未将全局变量初始化造成错误,说明对全局变量理解不够深入,错误代码及改正如下:

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
于教学实验综合楼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章