【蓝蓝计算机考研算法】-day21-求二叉树最小深度

41 阅读2分钟

30、给定一个二叉树,找出其最小深度

给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
最小深度是从根节点到最近叶子节点的最短路径的节点数量。 如图:返回他的最小深度2:
3 9 -1 -1 20 15 -1 -1 7 -1 -1(先序遍历)

image.png

思路

利用先序创建二叉树,递归计算数的深度,分别考虑空树、左子树为空,右子树为空、左右子树均不空的情况下树的最小深度,由于深度是从根结点开始自顶向下逐层累加的,所以最后深度要+1.

代码实现

#include <iostream>
#include<stdio.h>
//定义二叉树的结构体
typedef struct BiTNode {
    int data;//数据域
    struct BiTNode* lchild, * rchild;//左、右孩子指针
}BiTNode,*BiTree;
//创建二叉树 先序
BiTree CreatBTree() {
    int  val;//结点数据
    printf("请输入值(-1为空)");
    scanf_s("%d", &val);
    if (val==-1) {
       return NULL;//val等于#,代表该结点不存在
    }
    else {
        BiTree node = (struct BiTNode*)malloc(sizeof(struct BiTNode));//创建结点
        node->data = val;
        printf("%d的左孩子为:\n", val);
        node->lchild = CreatBTree();//创建左孩子
        printf("%d的右孩子为:\n", val);
        node->rchild = CreatBTree();//创建右孩子
        return node;
    }
}
// 计算最小深度函数
int MinDepth(struct BiTNode* root) {
    if (root == NULL) {
        return 0;//如果为空,深度为0
    }
    else if (root->lchild == NULL && root->rchild == NULL) {
        return 1;//如果没有子结点,深度为1,(只有根结点)
    }
    else if (root->lchild == NULL) {//左子树为空
        return MinDepth(root->rchild)+1 ;//左空,递归计算右子树深度
    }
    else if (root->rchild) {//右子树为空
        return MinDepth(root->lchild)+1 ;//右空,递归计算左子树深度
    }
    else {//左右子树均不为空
        int LeftDepth = MinDepth(root->lchild);
        int RightDepth = MinDepth(root->rchild);
        return (LeftDepth < RightDepth ? LeftDepth : RightDepth)+1 ;//比较左右子树深度大小
    }
}
int main()
{
    struct BiTNode* root = CreatBTree();
    int min_depth = MinDepth(root);
    printf("二叉树最小高度为:%d", min_depth);
    return 0;
}

运行结果

image.png

复杂度

  • 时间复杂度 O(n)--- 递归访问二叉树所有节点 ,其中n为节点总数
  • 空间复杂度 O(n)--- 最坏情况下二叉树呈现链状,递归栈深度等于二叉树节点数n

小结

容易忽略结点深度是从从根结点开始自顶向下逐层累加的,需要算上根结点