水下功夫做透,水上才能顺风顺水。

求二叉树结点个数和深度

typedef struct Node{                        
    struct Node *lchild;                    
    char data;                
    struct Node *rchild;
}BTNode;    

 

 //求二叉树中的节点个数 1)如果二叉树为空,节点个数为0  
(2)如果二叉树不为空,二叉树节点个数 = 左子树节点个数 + 右子树节点个数 + 1

int getNodeNum(BTNode* root) 
{    
    if(root == NULL) {
        return 0;
     }else{
        return getNodeNum(root->lchild) + getNodeNum(root->rchild) + 1;
     }        
} 

 

//求二叉树中叶子节点的个数1)如果二叉树为空,返回0 
(2)如果二叉树不为空且左右子树为空,返回1 
(3)如果二叉树不为空,且左右子树不同时为空,返回左子树中叶子节点个数加上右子树中叶子节点个数 
int getLeafNodeNum(BTNode* root)
{
    if(root == NULL)
        return 0;
    if(root->lchild == NULL && root->rchild == NULL)
        return 1;
    int leftNum = getLeafNodeNum(root->lchild); //左子树中叶节点的个数
    int rightNum = getLeafNodeNum(root->rchild); //右子树中叶节点的个数
    return (leftNum +rightNum);
}

 

 

//求二叉树第k层的节点个数 1)如果二叉树为空或者k<1返回0 
(2)如果二叉树不为空并且k==1,返回1 
(3)如果二叉树不为空且k>1,返回左子树中k-1层的节点个数与右子树k-1层节点个数之和 

int getNodeNumKthLevel(BTNode* root, int k)
{
    if(root==NULL || k<1)
        return 0;
    if(k == 1)
        return 1;
    int leftNum = getNodeNumKthLevel(root->lchild, k-1); //左子树中k-1层的节点个数
    int rightNum = getNodeNumKthLevel(root->rchild, k-1); //右子树中k-1层的节点个数
    return (leftNum + rightNum);
}

 

//求二叉树的深度
(1)如果二叉树为空,二叉树的深度为0 
(2)如果二叉树不为空,二叉树的深度 = max(左子树深度, 右子树深度) + 1
int
depth(BTNode* root) { if(root==NULL){//头指针为空 return 0; } else { int m = depth(root->lchild ); int n = depth(root->rchild); return (m>n)?(m+1):(n+1);//1是加上顶点的深度 } }

 

二叉树的最小深度:从根节点到最近叶子节点的最短路径上的节点数量。。
int minDepth(BTNode *root) {
    if(root == NULL){
       return 0;
    }
    if(root->lchild == NULL&&root->rchild == NULL){
        return 1;
    }
    //若左子树为空,则返回右子树的深度,反之返回左子树的深度
    if(root->lchild == NULL){
        return minDepth(root->rchild) + 1;
    }else if(root->rchild == NULL){
        return  minDepth(root->lchild) + 1;
    }else{
        //如果都不为空,则返回左子树和右子树深度的最小值
        int leftDepth = minDepth(root->lchild) + 1;
        int rightDepth = minDepth(root->rchild) + 1;
        return leftDepth<rightDepth ? leftDepth:rightDepth;
    
    }

}

 

posted @ 2020-03-01 17:39  北方寒士  阅读(1223)  评论(0编辑  收藏  举报