[蓝蓝计算机考研算法]-day21求二叉树的最小深度

94 阅读1分钟

题目描述

给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

image.png 返回它的最小深度。

示例

输入: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;
}

小结

二叉树基本的递归方法要熟练。