30、给定一个二叉树,找出其最小深度
给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
最小深度是从根节点到最近叶子节点的最短路径的节点数量。 如图:返回他的最小深度2:
3 9 -1 -1 20 15 -1 -1 7 -1 -1(先序遍历)
思路
利用先序创建二叉树,递归计算数的深度,分别考虑空树、左子树为空,右子树为空、左右子树均不空的情况下树的最小深度,由于深度是从根结点开始自顶向下逐层累加的,所以最后深度要+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;
}
运行结果
复杂度
- 时间复杂度 O(n)--- 递归访问二叉树所有节点 ,其中n为节点总数
- 空间复杂度 O(n)--- 最坏情况下二叉树呈现链状,递归栈深度等于二叉树节点数n
小结
容易忽略结点深度是从从根结点开始自顶向下逐层累加的,需要算上根结点