题目描述
给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
返回它的最小深度。
示例
输入:3 9 0 0 20 15 0 0 7 0 0 (上图的先序遍历序列)
输出:2
思路
-
定义二叉树的链表结构,写一个用先序遍历来创建链表的函数。(中序、后序、层序也可以)
-
写一个求最小二叉树深度的函数,和求最大深度相似,但多了一些条件的判断。当左子树为空时,输出右子树的最小深度+1;当右子树为空时,输出左子树的最小深度+1;当左右子树都不为空时,输出左右子树的最小值+1。
-
在main方法中定义一个二叉树,调用函数创建二叉树、求二叉树最小深度,并输出。
具体实现
#include<bits/stdc++.h>
using namespace std;
typedef struct node{
int data;
node *left,*right;
node(int x):data(x), left(nullptr), right(nullptr){}
}*BitTree;
//先序遍历创建二叉树
void CreatT(BitTree &T){
int x;
cin>>x; //输入结点数
if(x == 0) T=nullptr; //若x为0,则为空结点
else{
T = new node(x);
CreatT(T->left);
CreatT(T->right);
}
}
//求二叉树最小深度
int MinDeepth(BitTree T){
if(T == nullptr) return 0;
if(T->left == nullptr) //若左子树为空,返回右子树的最小深度+1
return MinDeepth(T->right)+1;
if(T->right == nullptr) //若右子树为空,返回左子树的最小深度+1
return MinDeepth(T->left)+1;
//左右子树都不为空时,取最小值
int x = MinDeepth(T->left);
int y = MinDeepth(T->right);
return min(x,y)+1;
}
int main(){
BitTree T;
CreatT(T);
cout<<MinDeepth(T);
return 0;
}
小结
二叉树基本的递归方法要熟练。