二叉树算法小结

前言

本文是个人阅读labuladong算法秘籍二叉树内容的小结,便于以后自己复习。

一、内容精要

1.1 二叉树的重要性

许多经典算法可以总结成树的问题,因此,学会解决二叉树的问题对于解决许多算法都很有用。

1.2 二叉树算法的基础

二叉树的基本概念、递归和遍历框架是二叉树算法的基础。
二叉树的基本概念包括了解树、满二叉树、完全二叉树、二叉搜索树等基础概念。
二叉树的遍历包括前序、中序和后序遍历,框架如下:

/* ⼆叉树遍历框架 */
void traverse(TreeNode root) {
	// 前序遍历
	traverse(root.left)
	// 中序遍历
	traverse(root.right)
	// 后序遍历
}

1.3 基本思路

选择一个当前节点,明确当前节点要做的事情(通用的解决方法,适用于当前和所有子节点),以及在前序、中序还是后序去做这件事,利用递归调用子节点(需要完成这件事的节点)做同样的事。

难点在于:如何把题目要求细化成当前节点要做的事。

说明:如果“要做的事中涉及调用多个辅助函数”,则考虑是否能在后序位置实现,降低时间复杂度,即考虑,当前节点所需要的信息能否由左右两个子节点推导出来。

1.4 递归的方法

明确函数的定义,利用定义推导结果,不要跳入递归细节。

1.5 二叉搜索树(BST)

1.5.1 特点

二叉搜索树是二叉树中的一种类型。其具有以下特点:
(1)“左小右大”,对于每一个BST节点,左子树的节点都小于当前节点,右子树节点则都大于当前节点。
(2)对于每个BST节点,左子树和右子树都为BST。
(3)中序遍历的结果是有序的,可升序可降序。
中序遍历的实质是将二叉树节点转换成一维数组,通过操作索引来实现。

1.5.2 时间复杂度

二叉搜索树的时间复杂度一般是O(logN),可以通过“左小右大”的性质来缩小检索时间,通常的做法是在二叉树的结构中额外维护一个size来记录以自己为根的这颗二叉树有多少节点。

在算法题中,二叉树的数据结构往往是给定的,因此,时间复杂度常常是O(logN)。

1.5.3 基础操作

判断二叉搜索树的合法性、增、删、查是二叉搜索树的基础操作。
处理该类问题往往是遍历+基础操作。

I、判断BST合法性
思路:判断当前节点大于整棵左子树的节点值,小于整棵右子树的节点值,由于当前主函数无法满足约束,因此引入辅助函数和min和max参数,根据当前节点信息将约束传递下去。

II、增
思路:根据二叉搜索树“左小右大”的性质,判断当root.val < target 时,在右子树查找,当root.val > target时,在左子树查找,当==时,执行增加操作。

III、查
思路:根据二叉搜索树“左小右大”的性质,判断当root.val < target 时,在右子树查找,当root.val > target时,在左子树查找,当==时,执行相关查找操作。

IV、删除
思路:根据“左小右大”先找到target节点,分情况讨论,当target节点为(root.left == null || root.right == null),则直接删除该节点,当target节点有左右子树,则需要在保证删除节点后仍为BST,因此,需要在删除该节点后连接左树的最大节点或右树的最小节点,以右树为例,需要引入辅助函数,找到右树最小节点,其次删除右树中的该最小节点,将右树该节点连接上去, 并替换target节点。

二、写二叉树算法的一些tips

(1)先考虑base case,输入为空/0,索引lo<hi,空节点等情况,根据输出return相应的值。
(2)考虑是否需要引入辅助函数,引入的辅助函数可以调整参数,通过引入参数增加约束。如果不需要改变输入的参数,可以不引入辅助辅助函数。
引入的辅助函数要注意输出类型,一般与主函数保持一致(看具体实现)。
(3)一般题目思路是:

  • 根据题目要求明确主函数“效果”,考虑是否需要引入辅助函数(是否需要调整输入参数便于操作,或者引入更多参数进行额外约束),如果需要辅助函数,明确辅助函数的“效果”
  • 结合函数“效果”,在当前节点完成事情
    经典例子:Leetcode:654题

说明:对于数组的二叉树问题,一般都需要引入索引,辅助函数引入的索引参数要注意base case,常见的有 lo < hi 情况,返回值根据题意,是返回null ,0 还是1等,其次,对于初值也要注意。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值