二叉树深度的中间值(后序遍历)

33 篇文章 0 订阅
订阅专栏
这篇博客介绍了如何求解给定二叉树的叶子节点深度的中间值,即最小深度和最大深度的平均值。首先分别讲解了如何计算二叉树的最大深度和最小深度,通过深度优先搜索实现。对于最大深度,递归遍历左右子树并取较大值加一。对于最小深度,考虑左右子树为空或不为空的情况,返回合适的最小深度。最后,将两者相加除以二得到中间值。
摘要由CSDN通过智能技术生成

 题目描述:

给定一个二叉树,找出其叶子节点深度的中间值。

叶子节点的深度是从根节点到叶子节点的路径上的节点数量。     

最小深度是从根节点到最近叶子节点的路径上的节点数量。

最大深度是从根节点到最远叶子节点的路径上的节点数量。

中间值为叶子节点最小深度和最大深度的平均值。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

    3

   / \

  9  20

    /  \

   15   7

它的最小深度为2,最大深度为3,则中间值为(2+3)/2=2.5

算法思路:

此题的实现思路可以结合力扣上两道简单的树的题目。分别为:

  1. 二叉树的最小深度
  2. 二叉树的最大深度

 二叉树的最大深度:

算法思路:

特殊情况处理:如果root为空,返回0;

求二叉树的最大深度:就是深度优先搜索树的左子树和右子树,然后取两者的最大值,再加一,加一的原因在于,需要加上当前节点,我理解的为加上需要递归的结点。

代码实现:递归图解:

int maxDepth(TreeNode* root) {
		if (root == nullptr) return 0;
		return max(maxDepth(root->left), maxDepth(root->right)) + 1;
	}

对树不熟悉的其实完整的代码为:

class Solution {
public:
    int getDepth(TreeNode* node) {
        if (node == NULL) return 0;
        int leftDepth = getDepth(node->left);       // 左
        int rightDepth = getDepth(node->right);     // 右
        int depth = 1 + max(leftDepth, rightDepth); // 中
        return depth;
    }
    int maxDepth(TreeNode* root) {
        return getDepth(root);
    }
};

  二叉树的最小深度:

看完了最大深度之后,再来看最小深度,第一次写很容易写成

int maxDepth(TreeNode* root) {
		if (root == nullptr) return 0;
		return max(maxDepth(root->left), maxDepth(root->right)) + 1;
	}

但是这是不对滴。

看题目,题目的最小深度的定义为:最小深度是从根节点到最近叶子节点的路径上的节点数量。

上方的写法如果一棵树的左孩子为空,只有右孩子时,此时的最小深度并不是1,而是右子树的最小深度。

class Solution {
public:
    int minDepth(TreeNode* root) {
        if (root == NULL) return 0;
        if (root->left == NULL && root->right != NULL) {//左子树为空,右子树不空时
            return 1 + minDepth(root->right);//返回的是右子树的最小深度
        }
        if (root->left != NULL && root->right == NULL) {//左子树不为空,右子树为空
            return 1 + minDepth(root->left);//返回的是左子树上最小深度
        }
        return 1 + min(minDepth(root->left), minDepth(root->right));//左右子树都不空时,返回左右子树其中的最小值。
    }
};

最终代码: 

代码实现:

#include<iostream>
#include<vector>
#include<algorithm>
#include<unordered_map>
#include<queue>
#include<set>
#include<cstring>
#include<functional>
using namespace std;
struct TreeNode

{

	int val;

	TreeNode *left;

	TreeNode *right;

	TreeNode() : val(0), left(NULL), right(NULL) {}

	TreeNode(int x) : val(x), left(NULL), right(NULL) {}

	TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}

};
class Solution {
public:
	double maxDepth(TreeNode* root) {
		if (root == nullptr) return 0;
		return max(maxDepth(root->left), maxDepth(root->right)) + 1;
	}
	int minDepth(TreeNode* root) {
        if (root == NULL) return 0;
        if (root->left == NULL && root->right != NULL) {//左子树为空,右子树不空时
            return 1 + minDepth(root->right);//返回的是右子树的最小深度
        }
        if (root->left != NULL && root->right == NULL) {//左子树不为空,右子树为空
            return 1 + minDepth(root->left);//返回的是左子树上最小深度
        }
        return 1 + min(minDepth(root->left), minDepth(root->right));//左右子树都不空时,返回左右子树其中的最小值。
    }

	double aveDepth(TreeNode* root) {
		double res;
		res = (maxDepth(root) + minDepth(root)) / 2;
		return res;
	}
};

TreeNode* inputTree()

{

	int n, count = 0;

	char item[100];

	cin >> n;

	if (n == 0)

		return NULL;



	cin >> item;

	TreeNode* root = new TreeNode(atoi(item));

	count++;

	queue<TreeNode*> nodeQueue;

	nodeQueue.push(root);



	while (count<n)

	{

		TreeNode* node = nodeQueue.front();

		nodeQueue.pop();



		cin >> item;

		count++;

		if (strcmp(item, "null") != 0)

		{

			int leftNumber = atoi(item);

			node->left = new TreeNode(leftNumber);

			nodeQueue.push(node->left);

		}



		if (count == n)

			break;



		cin >> item;

		count++;

		if (strcmp(item, "null") != 0)

		{

			int rightNumber = atoi(item);

			node->right = new TreeNode(rightNumber);

			nodeQueue.push(node->right);

		}

	}

	return root;

}

int main()

{

	TreeNode* root;

	root = inputTree();

	double res = Solution().aveDepth(root);

	cout << res;
	getchar();
	getchar();
}

二叉树的层序遍历/后序遍历(leetcode104二叉树的最大深度、111二叉树的最小深度)(华为OD悄悄话、数组二叉树
欢迎来到我的博客~
06-29 1648
给定一个二叉树 root ,返回其最大深度二叉树的 最大深度 是指从节点到最远叶子节点的最长路径上的节点数。本题可以使用前序(中左右),也可以使用后序遍历(左右中),使用前序求的就是深度,使用后序求的是高度。二叉树节点深度:指从节点到该节点的最长简单路径边的条数或者节点数(取决于深度从0开始还是从1开始)二叉树节点的高度:指从该节点叶子节点的最长简单路径边的条数或者节点数(取决于高度从0开始还是从1开始)
二叉树】详解 树的遍历 (前序/中序/后序/层序) (递归+迭代)
闻韶
07-29 4067
LeetCode - 探索卡片 - 二叉树 - 一 - 树的遍历
面试题之二叉搜索树的中位数
斯巴达的勇士已经是雅典的臣民了。。。
10-11 7294
这个问题不算是很常见的问题,基本上在中文的论坛社区没有看到过,遇见这个是因为偶尔在http://www.ocf.berkeley.edu/~wwu/cgi-bin/yabb/YaBB.cgi 上面注册了账号而看到的,题目如下:Given a BST (Binary search Tree) how will you find median in that?   C
二叉查找树与中间查找
我想跟代码谈谈
09-29 2198
二叉查找树是具有如下性质的一种二叉树:对于任一结点x,x的左子树结点的关键字均不大于x,右子树结点的关键字均不小于x。 二叉查找树的特点是位置决定了顺序,所以在不对关键字进行排序的情况下,通过位置关系就能找到特定大小的关键字结点。例如,对二叉查找树进行中遍历就能按升序输出所有的关键字。   二叉查找树的搜索:从节点开始,对于树中任一结点k,若k的关键字大于待搜索的x,则搜索k的左子树;
[算法] 二叉排序树查找中位数
只为分享
11-14 1046
比较tricky的解法,不用额外的内存 首先考虑将二叉树转换成双向链表 [LeetCode] 426. Convert Binary Search Tree to Sorted Doubly Linked List 将二叉搜索树转为有序双向链表 然后通过查找链表中间节点的方法找到中位数 def doubleconvert(root): if not root: return None ...
C++ 计算二叉树深度
weixin_43828675的博客
03-18 2133
二叉树深度可通过BFS,DFS计算获得。 #include <iostream> #include <queue> using namespace std; class TreeNode { public: TreeNode* left; TreeNode* right; int val; TreeNode(int value):val(value),left(NULL),right(NULL){} }; // BFS实现二叉树深度计算 int
SDUTOJ 2804 - 数据结构实验之二叉树八:(中序后序)求二叉树深度
sugerandmaster
10-21 189
Problem Description 已知一颗二叉树的中序遍历序列和后序遍历序列,求二叉树深度。 Input 输入数据有多组,输入T,代表有T组数据。每组数据包括两个长度小于50的字符串,第一个字符串表示二叉树的中序遍历,第二个表示二叉树后序遍历。 Output 输出二叉树深度。 Sample Input 2 dbgeafc dgebfca lnixu linux Sample Outpu...
二叉树的前中后序遍历(比较挫)
12-12
本话题将深入探讨二叉树的前序、中序和后序遍历,以及它们的实现和优缺点。 **前序遍历**: 前序遍历,也称作-左-右遍历,是先访问节点,然后递归地遍历左子树,最后遍历右子树。在非递归实现中,可以使用栈来...
erchashubianli.rar_erchashubianli_二叉树 深度_二叉树遍历_遍历
09-19
在计算机科学中,二叉树遍历是访问二叉树中所有节点的一种方法,通常包括三种主要的遍历方式:先序遍历、中序遍历和后序遍历。这些遍历方式对于理解和操作二叉树至关重要,特别是在搜索、排序、数据存储和算法设计等...
【数据结构】二叉树的存储结构及先/中/后序递归遍历算法(C语言)
weixin_51450101的博客
02-03 4653
目录1. 树与二叉树1.1 树的基本概念1.2 二叉树的基本概念2. 二叉树的存储结构及遍历算法2.1 二叉树的存储结构2.2 二叉树的前中后序遍历2.3 遍历算法的应用2.4 完整实现代码2.5 运行结果3. 遍历算法基于栈的递归消除 1. 树与二叉树 1.1 树的基本概念 树是 n(n>=0)个结点的有限集合 T。当 n = 0 时,称为空树;当 n>0 时,该集合满足: ① 其中必有一个称为(root)的特定结点,它没有直接前驱,但有零个或多个直接后驱。 ② 其余 n-1 个结点可以划分
二叉树中的查找操作(按查找、按位查找)
薛定谔的猫的博客
10-18 5734
文章目录查找元素为x的结点并删除以其为的子树查找为x的结点并打印其所有祖先 查找元素为x的结点并删除以其为的子树 题目描述:  已知二叉树以二叉链表存储,请编写一个算法:对于树中每个元素为x的结点,删去以它为的子树,并释放相应的空间。 算法思想:  删除以元素x为的子树,只要能删除其左右子树,就可以释放为x的结点,故采用后序的方式实现。  删除为x的结点,意味着应将其父结点的左(右)子女指针置空,用层次遍历易于找到某结点的父结点。  要求删除树中每个元素为x的结点的子树,故要遍历完二
树状数组之查找中位数详解(1057 Stack (30 分))
m0_37407587的博客
11-23 2139
intuition 最近在刷pta甲级的题目, 解题过程中遇到一个之前没有用过的知识点——树状数组, 原题链接在这里1057 Stack (30 分), 题目的大致意思是在传统的栈的基础上,要添加一个查询当前栈中元素的中位数的功能, 首先想到可以用通过维护一个BST来做, 在一个二叉搜索树中插入和删除元素都是数据结构的基本内容, 查找在所有节点中比当前节点小的节点数也可以在log(n)的复杂度实现...
二叉树的实现(遍历,复制,求深度,求结点)
匿名攻城狮
04-16 715
实现效果: 测试用树: #include<iostream> using namespace std; typedef struct BiTNode {//二叉树的二叉链表存储 char data; struct BiTNode *lchild, *rchild; }BiTNode,*BiTree; void CreateBiTree(BiTree &T) {//...
利用二叉树实现中缀表达式的计算
weixin_41760180的博客
07-11 1645
之前按照数据结构的课本(李忠月版)实现了利用两个栈来进行中缀表达式的计算,下面这段代码可以实现利用二叉树来进行中缀表达式的计算,计算过程中不适用栈,仅利用二叉树后序遍历思想。 #include<stdio.h> #include<stdlib.h> #define INIT_SIZE 10 #define INCREMENTSIZE 10 typedef struct...
LeetCode111 给定一个二叉树找出其最小深度。 最小深度是从节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点节点
CourageKang的博客
09-07 908
给定一个二叉树找出其最小深度。 最小深度是从节点到最近叶子节点的最短路径上的节点数量。 说明: 叶子节点是指没有子节点节点。 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * ...
Leedcode编程题-面试题55 - I. 二叉树深度----C++实现
一位媛的修炼之路
06-17 212
目的: 旨在记录在Leedcode网上刷题的过程,记录心得。 题目: 输入一棵二叉树节点,求该树的深度。从节点到叶节点依次经过的节点(含、叶节点)形成树的一条路径,最长路径的长度为树的深度。 例如: 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最大深度3 。 思路: 递归遍历方法 若当前结点为空则返回0; 否则分别求当前结点的左右子树的深度,取左右...
给定一个二叉树找出其最大深度二叉树深度节点到最远叶子节点的最长路径上的节点数。说明: 叶子节点是指没有子节点节点。【LeetCode Hot 100】
小型骷髅的博客
03-07 779
力扣热题100之第104题: class Solution { public int maxDepth(TreeNode root) { //当root为null时,二叉树长度为0 if(root == null){ return 0; } //当root左右子树都不为null,整棵树最大长度为左右子树长度的最大+1; return 1 + Math.max(maxDepth(root.
LeetCode题目:二叉树的最大深度c++实现)
qq_45449668的博客
05-03 346
题目 给定一个二叉树找出其最大深度二叉树深度节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点节点。 示例 给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回它的最大深度 3 。 想法 该题不是很难,总体上我们使用迭代的方法来求解,一步步深入到最小子树。在最小...
给定一个二叉树找出其最大深度。leetcode104
weixin_43283092的博客
09-09 1389
给定一个二叉树找出其最大深度二叉树深度节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点节点。 示例: 给定二叉树 [3,9,20,null,null,15,7], 对于该递归函数可以这样理解:一旦没有找到节点就会返回 0,每弹出一次递归函数就会加一,树有三层就会得到3 var maxDepth = function(root) { if (!roo...
FBI树构建与后序遍历
给定的数据规模下,N的最大为10,因此可以保证树的深度不会过大,计算量在可接受范围内。 另一个题目涉及的是一个关于时间安排和情绪管理的问题。津津是一名初中生,她需要平衡学校课程和额外的课外活动。如果...
写文章

热门文章

  • slam原理介绍和经典算法 25235
  • Visual Studio实现光流法(opencv and Eigen) 9242
  • VMware无法连接网络问题&&不显示网络连接 7850
  • Deformable DETR环境配置和应用 5334
  • 视频追踪(meanshift和camshift算法) 5013

分类专栏

  • 力扣刷题 33篇
  • VSLAM 11篇
  • nodejs 3篇
  • 前端 1篇
  • 物联网 1篇
  • ROS 8篇
  • opencv图像处理 26篇
  • QT 4篇
  • 论文阅读笔记 4篇
  • yolo目标检测 3篇
  • python 3篇
  • 图像识别 3篇
  • Ubuntu 1篇
  • 选题方向 2篇
  • turtlebot 5篇
  • git 1篇

最新评论

  • Deformable DETR进行目标检测,解决size mismatch问题

    #@?: 作者,你的detect.py是在哪个文件夹里啊

  • ubuntu下共存多个python版本,切换python版本

    语风之: 非常详细

  • VMware无法连接网络问题&&不显示网络连接

    不要学我说话:|: 表情包表情包表情包表情包谢谢大佬 解决啦

  • VMware无法连接网络问题&&不显示网络连接

    青山烬: 没看见方法二啊

  • Deformable DETR环境配置和应用

    麦田里的捡穗狗: 如果没有gpu可以玩吗

最新文章

  • 438. 找到字符串中所有字母异位词
  • mongoose学习记录
  • mongoDB非关系型数据库学习记录
2024年1篇
2023年8篇
2022年33篇
2021年59篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家商场玻璃钢雕塑价格陕西创意玻璃钢雕塑订做价格芜湖玻璃钢雕塑哪里有昆明市玻璃钢雕塑供应宣城玻璃钢雕塑供应商兰州动物玻璃钢雕塑定做南京户内玻璃钢雕塑市场玻璃钢雕塑厂起名烟台玻璃钢雕塑订制价格加厚玻璃钢花盆辽宁商场主题创意商业美陈理念西安玻璃钢雕塑小品定制濮阳大型玻璃钢仿铜雕塑莱山商场美陈江苏泡沫玻璃钢雕塑批发常州高档玻璃钢花盆鼓楼商场节庆美陈濮阳玻璃钢喷泉雕塑加工广州哪个商场有美陈黑龙江景观玻璃钢雕塑价位玻璃钢白鹭雕塑多少钱欢乐谷玻璃钢雕塑卡通雕塑狮子玻璃钢雕塑濮阳景观玻璃钢人物雕塑定做扬州商场美陈策划抽象玻璃钢彩绘雕塑小品郑州玻璃钢不锈钢树叶雕塑小品玻璃钢罗马柱雕塑楚雄市玻璃钢雕塑玻璃钢花盆陶瓷花盆香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化