1. 程式人生 > >39-求二叉樹的最小深度和最大深度

39-求二叉樹的最小深度和最大深度

問題描述

給定一個二叉樹,找出其最小深度和最大深度。

二叉樹的最小深度為根節點到最近葉子節點的距離。

二叉樹的最大深度為根節點到最遠葉子結點的距離

給出一棵如下的二叉樹:


      1
     / \ 
    2   3
       /  \
      4    5  

這個二叉樹的最小深度為 2,最大深度為3

解題思路

  • 一定要注意定義,比如下面這棵樹的最小深度是3不是1

   1
    \
     2
      \
       3
  • 方法和找最大深度一樣
    只需要判斷如果左右兒子中有空結點,則返回非空結點的兒子的高度+1
  • 最大深度則不需要考慮空結點的問題啦~

以上主體描述,參考連結:https://www.jianshu.com/p/884b6d3bd9d3 

程式碼實現

/*********************************************** 
【問題描述】 
Author:tmw 
date:2018-2-14 
************************************************/  
#include <stdio.h>  
#include <stdlib.h>  
  
/**二叉樹的資料結構**/  
typedef struct BiTreeNode  
{  
    char data;  
    struct BiTreeNode *lchild;  
    struct BiTreeNode *rchild;  
}BiTreeNode,*BiTree;  
  
  
/**二叉樹的建立--按照先序方式建立--插入**/  
void CreateBiTree(BiTree *T)  
{  
    char val;  
    scanf("%c",&val);  
  
    if(val == '#')  
        *T = NULL;  //null表示為空枝  
  
    else  
    {  
        *T = (BiTree)malloc(sizeof(BiTreeNode));  
        if(!*T)  
            exit(0);  
        (*T)->data = val;  
        CreateBiTree(&(*T)->lchild);  
        CreateBiTree(&(*T)->rchild);  
    }  
}  
  
int minDepth(BiTree T)  
{  
    if(T==NULL)  
        return 0;  
    int depth_left = minDepth(T->lchild);  
    int depth_right = minDepth(T->rchild);  
    if(depth_left==0||depth_right==0)  
        return depth_left+depth_right+1;  
    else  
        return depth_left>depth_right?depth_right+1:depth_left+1;  
}  
  
int maxDepth(BiTree T)  
{  
    if(T==NULL)  
        return 0;  
    int depth_left = maxDepth(T->lchild);  
    int depth_right = maxDepth(T->rchild);  
    return depth_left>depth_right?depth_left+1:depth_right+1;  
}

測試程式碼

測試資料按照下圖給出的提供:

int main()
{
    printf("測試程式碼\n");

    BiTree T;
    printf("建立二叉樹:請按先序遍歷的方式輸入二叉樹結點:\n");
    CreateBiTree(&T);
    printf("此二叉樹的最小深度為:%d\n",minDepth(T));
    printf("此二叉樹的最大深度為:%d\n",maxDepth(T));

    return 0;
}

測試結果如下: