二叉树刷题学习笔记1——框架

LeetCode刷题攻略 应届生面试算法就考个数组 链表 二叉树 矩阵 数组变着法子考你排序 查询 指针 位运算 链表变着法子考你指针 最多再考个哈希 二叉树变着法子考用递归和栈前中后遍历 最多加上回溯 矩阵的话就是知道起点的路径查询和不知道起点的路径查询 掌握了这些 面大厂就比较轻松了 其实和学历技术关系也不大 大部分人先死到想都不敢想上了。 据了解,LeetCode 是一个非常棒的 OJ(Online Judge)平台,收集了许多公司的面试题目。相对其他 OJ 平台而言,有着下面的几个优点: 题目全部来自业内大公司的真. 阅读详情

上一篇:数据结构与算法——树

总结

二叉树解题的思维模式可以总结为以下:

  • 如果是通过遍历一遍二叉树得到的答案,这种是遍历的思维模式
  • 如果是通过子问题推导得到原问题答案的,这种是分解的思维模式

数据遍历框架

普通数组链表遍历:

  • 对数据的遍历无非就是顺序遍历或者递归遍历,遍历的对象无非也就是数组和链表,一般来说,我们遍历数据有以下框架:
/* 迭代遍历数组 */
void traverse(int[] arr) {
    for (int i = 0; i < arr.length; i++) {

    }
}

/* 递归遍历数组 */
void traverse(int[] arr, int i) {
    if (i == arr.length) {
        return;
    }
    // 前序位置
    traverse(arr, i + 1);
    // 后序位置
}

/* 迭代遍历单链表 */
void traverse(ListNode head) {
    for (ListNode p = head; p != null; p = p.next) {

    }
}

/* 递归遍历单链表 */
void traverse(ListNode head) {
    if (head == null) {
        return;
    }
    // 前序位置
    traverse(head.next);
    // 后序位置
}

二叉树的遍历框架如下:

  • 对比上面的数组和链表的遍历,二叉树的遍历其实没有什么很大的区别,只是多了一个中序位置(二叉树的左子树都遍历完后开始遍历右子树的时候的位置)。
  • 但是我这里说的前序位置、中序位置和后续位置和前面说的前序遍历、中序遍历、后续遍历不是一个意思,这里的位置表示的是进入节点的三个特殊的时间点。
void traverse(TreeNode root) {
    if (root == null) {
        return;
    }
    // 前序位置
    traverse(root.left);
    // 中序位置
    traverse(root.right);
    // 后序位置
}

  • 这里我们总结上面的遍历框架,对于递归形式的遍历,会出现一个前序和后序的位置,分别是在递归的前后,其实所谓的前序位置,就是在进入一个节点之前的位置,后续位置就是在进入一个节点之后的位置,这里我们举一个例子倒序打印,解决的方法有很多,比如这里我们可以利用后序位置来打印

代码框架

/* 递归遍历单链表,倒序打印链表元素 */
void traverse(ListNode head) {
    if (head == null) {
        return;
    }
    traverse(head.next);
    // 后序位置
    print(head.val);
}

具体代码

public class Demo {
	public static void main(String[] args) {
		ListNode head=new ListNode();
		head.val=0;
		ListNode p=head;//表示上一级
		
		for (int i = 0; i < 10; i++) {
			ListNode listNode=new ListNode();
			listNode.val=i+1;
			
			p.next=listNode;
			p=p.next;
			
			if(i==9) {//最后一个数据
				p.next=null;
			}
		}
		
		traverse(head);
	}
	
	/* 递归遍历单链表,倒序打印链表元素 */
	static void traverse(ListNode head) {
	    if (head == null) {
	        return;
	    }
	    traverse(head.next);
	    // 后序位置
	    System.out.print(head.val+" ");
	}
}
class ListNode {
    int val;
    ListNode next;
}

结果展示
在这里插入图片描述

  • 通过以上的例子,我们明白我说的前序位置、中序位置、后续位置的重要性,我们对递归算法的应用,就是在我说的这些位置进行操作。
  • 再以前序遍历、中序遍历、后序遍历来讲,我们的实现框架如下:
//递归实现前序遍历
	public void PreOrder(TreeNode root) {
		if(root!=null) {
			return;
		}
		System.out.println(root.val);
		PreOrder(root.left);
		PreOrder(root.right);
	}
	//递归实现中序遍历
	public void InOrder(TreeNode root) {
		if(root!=null) {
			return;
		}
		InOrder(root.left);
		System.out.println(root.val);
		InOrder(root.right);
	}
	//递归实现后序遍历
	public void PostOrder(TreeNode root) {
		if(root!=null) {
			return;
		}
		PostOrder(root.left);
		PostOrder(root.right);
		System.out.println(root.val);
	}

二叉树刷题

力扣题目示例: 二叉树的最大深度

使用递归算法,计算最大深度

class Solution {
	int max=0;//最大的深度
	int count=0;//维护当前的深度
	public int maxDepth(TreeNode root) {
		result(root);
		return max;
	}

	public void result(TreeNode root) {
		if (root == null) {
			max=max>count?max:count;
			return ;
		}
		count++;
		result(root.left);
		result(root.right);
		count--;
	}

}
  • 这里为什么要count--,因为遍历完右子树之后,需要切换到另一颗子树,这样,如果不减掉前一棵树的根节点,与本来的逻辑不符。最后,我们看到代码的框架,其实就是回溯算法的思想

当然,我们也容易发现,二叉树的最大深度是可以通过子树的最大深度度推导出来的,这样就可以使用分解问题计算答案,代码如下:

class Solution {
	public int maxDepth(TreeNode root) {
        if(root==null)
            return 0;

        int leftMax=maxDepth(root.left);
        int rightMax=maxDepth(root.right);

        int result=Math.max(leftMax,rightMax)+1;

        return result;
	}
  
}
  • 而这个,其实就是动态规划的思想。

下一篇:二叉树刷题学习笔记2

两个月搞定面试算法【小白leetcode刷题训练】【python专场】 前言 刷题顺序来自极客时间,共分为8个专题,每周1个,两个月认真刷完基本大厂面试OK(我说的是认真刷!只抄题解不算)。截止到博主结束秋招时只刷到第5个专题,也基本够用了。也就是说认真刷题的话一个月就可以有offer入手了。 当然现在BAT的笔试做起来还是觉得费力,笔试是真的难啊! 博主是python选手,题解都是python写的。有问题欢迎交流,共同进步。 文章内附leetcode链接,直接点链接去做就行。同类型的尽量整理到一起了,也方便自己今后复习。 推荐五遍刷题法 1、读题+思考,10分钟内没思路,直接 阅读详情

相关推荐

代码随想录刷题|一刷总结

成果汇报经验总结为什么要刷题未来计划以及附件资源,里面有所有pdf,需要自取。我会在末尾放上pdf,点击思维导图的右上角的【箭头】可以直接跳转到leetcode,提供一键跳转方便复习。

东东唯一指定铲屎官 7222

二叉树框架

情况 3:A 有两个子节点,麻烦了,为了不破坏 BST 的性质,A 必须找到左子树中最大的那个节点,或者右子树中最小的那个节点来接替自己。很简单,其实不需要递归地搜索两边,类似二分查找思想,根据 target 和 root.val 的大小比较,就能排除一边。有三种情况,用图片来说明。这样写是错误的,因为BST 的定义,root 需要做的不只是和左右子节点比较,而是要整个左子树和右子树所有节点比较。它的定义是:一个二叉树中,任意节点的值要大于等于左子树所有节点的值,且要小于等于右边子树的所有节点的值。

Debroon 291

【智能车学习】电磁循迹中的基本控制算法

今天心血来潮,突然想总结一下电磁车的一些基本算法,也希望可以给新手同学们一点帮助和参考。本篇主要讲述智能车电磁循迹中涉及到的基本算法,包括滤波算法,归一化算法,PID控制等

Carry_qing的博客 6万+

二叉树的结构特点及性质

概念:日常生活中树随处可见,但数据结构中的定义的树比较有趣,它是我们所见真实树的倒置,然后再抽象的一种结构,比较有意思。那么二叉树呢?见名知意,只有两个分叉的树。数据结构书中的解释为度不超过2的树,何为度?度的意思是当前结点有几个分叉就是几度。那又何为结点呢?个人理解分叉的地方都是结点,树的叶子也是结点,称为叶子结点! 是不是觉得有些抽象,那么下面咱们画图说一下,看图就比较好理解了。     ...

就是这么菜 1万+

手把手教你用EGM96模型校正DEM数据(含在线工具推荐)

本文详细介绍了如何使用EGM96地球重力场模型校正DEM数据中的高程偏差。通过对比WGS84椭球面与大地水准面的差异,解释了校正原理,并提供了从在线工具快速验证到Python脚本批量处理的全流程实战指南,帮助GIS开发者和数据分析师确保高程数据基准一致,提升空间分析精度。

ttt77的博客 1008

看我如何用kali实时截获隔壁"小姐姐"的上网隐私(结尾有彩蛋)

看我如何用kali实时截获隔壁&amp;amp;amp;quot;小姐姐&amp;amp;amp;quot;的手机图片等信息(结尾有彩蛋哦) 首先圈下重点:《刑法》第二百八十五条 【非法侵入计算机信息系统罪;非法获取计算机信息系统数据、非法控制计算机信息系统罪】违反国家规定,侵入国家事务、国防建设、尖端科学技术领域的计算机信息系统的,处三年以下有期徒刑或者拘役。违反国家规定,侵入前款规定以外的计算机信息系统或者采用其他技术手段,获取该计算机信息系统中存储、处理或...

SoulCat 2万+

二叉树算法框架思想

二叉树算法设计的总路线:明确一个节点要做的事情,然后剩下的事抛给框架。 void traverse(TreeNode root) { // root 需要做什么?在这做。 // 其他的不用 root 操心,抛给框架 traverse(root.left); traverse(root.right); } 举两个简单的例子体会一下这个思路,热热身。 如何把二叉树所...

Mr.魏 2136

游戏服务器框架之跨服(一)

如今的游戏开发,不搞个跨服玩法都不好意思说在做游戏了(当然,也跟游戏类型有关,一些轻度休闲游戏可以排除在外)。跨服玩法的设计,可以进一步激发玩家追求高战力的虚荣心,也可以汇聚玩家数量,避免单服日活跃低呈现死服现象。 几种常见的跨服玩法拓扑结构 一,不同游戏服的玩家进入中立服务器进行战斗,例如跨服天梯类玩法。 游戏服有很多个节点,中心服务器也有很多节点。只要保证对战的双方同时进入同一个中心服游戏进程即可。 二,若干个游戏服组成一个社区,全部服务器包含多个社区,例如世界服玩法。 三,游戏服A玩

littleschemer的博客 5777

二叉树类问题框架

文章目录前言解决方案应用示例二叉树最大路径和前、中序遍历还原二叉树判断两棵二叉树完全相同判断BST的合法性BST 遍历框架完全二叉树的节点数量二叉树节点公共祖先问题 前言 花些时间,把这段时间刷的题目分门别类的记录一下基础框架,留待后来人。 每个人的路不同,对我来说,不见得要把大部分时间投入到算法当中,我还是更喜欢系统框架搭建以及底层原理这种大开大合的功法吧。 系列开头先来个最简单的二叉树,使用此框架的前提是:你能把实际问题抽象成为二叉树问题。题目也好,现实问题也罢,都是会有“伪装”的。 解决方案 vo.

看,未来的博客 658

ROS入门教程(七)—— Gazebo与RViz联合仿真

通过Gazebo与RViz联合仿真实现机器人运动。

吾门的博客 1万+

人像抠图 + OpenGL ES 还能这样玩?没想到吧(附带源码)

OpenGL ES 利用抠图算法实现人像留色。

字节流动 3万+

有关二叉树框架

《labuladong 的算法⼩抄》学习笔记 基本的二叉树框架 void traverse(TreeNode root) { // 前序遍历 traverse(root.left) // 中序遍历 traverse(root.right) // 后序遍历 } LeetCode 124 题,难度 Hard,让你求⼆叉树中最⼤路径和,主要代码如下: int ans = INT_MIN; // 求二叉树中最长路径和 int oneSideMax(TreeNode* root) { i..

dujuancao11的博客 388

【图论】系列(七)图论的中心性度量方法及重要性评价指标

图论中的中心性度量方法是用来衡量图中各个节点(或顶点)相对重要性的指标。

qq_30066733的博客 1078

Leetcode刷题修炼手册

我的机器学习教程「美团」算法工程师带你入门机器学习 已经开始更新了,欢迎大家订阅~ 任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑~此外,公众号内还有更多AI、算法、编程和大数据知识分享,以及免费的SSR节点和学习资料。其他平台(知乎/B站)也是同名「图灵的猫」,不要迷路哦~ “跟着...

Machine Learning with Tutors 5万+

基于YOLOv10的PCB电子元件智能识别系统设计与实现

数据预处理模块:负责对原始PCB图像进行标注、增强和格式转换模型训练模块:基于YOLOv10架构进行模型训练和优化推理检测模块:加载训练好的模型进行实时检测用户界面模块:提供友好的交互界面,方便用户操作和结果可视化YOLO(You Only Look Once)系列算法自2016年提出以来,经历了多次迭代更新。YOLOv1-v3:奠定了YOLO系列的基础架构YOLOv4-v7:引入大量优化技巧和网络结构改进YOLOv8-v9:进一步优化模型结构和训练策略YOLOv10。

YOLO 157

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

算法题到底该怎么刷?高效刷题方法

算法题到底该怎么刷?高效刷题方法

weixin_41171614的博客 4106

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

算法刷题路线总结与相关资料分享

算法刷题路线总结,算法题刷题步骤介绍,数据结构与算法相关资料分享~

小新要变强的博客 8491

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【算法】刷题路线(系统+全面)

本系列基于当前各大公司对大公司的考察情况,给大家规划一条可行的算法刷题路线,大概会规划 200 道自认为有用的题,并且争取让初学者,能够刷起来更加丝滑,而且每个阶段都会进行相对应的说明。当然,无论是面试还是笔试,你也完全可以按照这个路线来,应付大公司算法面试是够的了。

wufaqidong1的博客 7954

二叉树刷题小结

if(!***********逻辑代码*************if(pre)pre = root;if(root)***********逻辑代码*************if(pre)pre = root;if(!***********逻辑代码*************if(pre)pre = root;

qq_61597023的博客 741

高频知识总结 | 算法题如何刷?我的高效刷题方法

下面把我平时针对每道题的题号收集、博客资料收集的文档都分享给大家。注意!这个题号并不是说就要全部都刷,因为时间来不及,一定把我上面提到的高频题按分类给刷明白了,如果有余力再把剩下的给刷了!所有回溯递归都是一样的套路,明确递归的对象,对一个节点进行考虑,正如二叉树一样,回溯其就是 N叉树 + 剪枝明确递归的对象,要对哪个节点进行递归(二叉树)?还是对一张表的一个格子进行递归(岛屿问题)?还是要对一个状态进行递归(全排列树状图画出来)?

C++,Java,Python,C#编程选手,偶尔刷刷leetcode 2793

【C++刷题】二叉树基础OJ题

记录C++刷题,二叉树基础题,包括:965. 单值二叉树 104. 二叉数的最大深度 144. 二叉树的前序遍历 100. 相同的树 101. 对称二叉树 572. 另一棵树的子树 牛客网KY11 二叉树遍历

tan_run的博客 908

leetcode刷题Day7-8 二叉树1

大奋算法一坨,学习一下,主要跟着这个仓库刷。youngyangyang04/leetcode-master: 《代码随想录》LeetCode 刷题攻略:200道经典题目刷题顺序,共60w字的详细图解,视频难点剖析,50余张思维导图,支持C++,Java,Python,Go,JavaScript等多语言版本,从此算法学习不再迷茫!🔥🔥 来看看,你会发现相见恨晚!🚀。

kelekelekle的博客 1924

[算法刷题笔记]二叉树练习(1)二叉树的镜像

学习算法,还有一些知识的时候,有时候看书后以为自己懂了,结果做题就发现自己没什么思路,为此,博主决定坚持刷题,这里给大家推荐一个适合大家做题复习,准备面试的网站点此进入,里面还有大量的面经,大家可以在面试之前去看看我们可以看到里面根据不同知识层面分成对应的题库,算法也进行了对应的分类,十分的友好,接下来就开始今天的刷题之旅上面那两种方法是我能够想出来的思路,如果大家想要看看其他的思路的话,我们可以在牛客的题解上面看到其他人的思路和代码,大家具体的可以去看看,也可以在上面和大家一起交流探讨牛客。.......

梦想也许遥不可及,但重要的是追梦的过程,用博客记录自己的成长,记录自己一步一步向上攀登的印记 917

二叉树刷题笔记(1)二叉树的中序遍历

记录一道很基础的题:二叉树的中序遍历。

weixin_63177957的博客 1578

【数据结构刷题专题】—— 二叉树

本文对二叉树专题做了详细讲解,(1)二叉树的遍历方式(2)二叉树的属性(3)二叉树的修改和构造(4)求二叉树的属性(5)二叉树公共祖先问题(6)二叉搜索树的修改和构造

BigDavid123的博客 1341
上一篇: 数据结构与算法——树
下一篇: 十大经典排序算法:快速排序和归并排序
@@老胡
博客等级 码龄7年 291粉丝 184原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值