【递归算法】二叉树剪枝

题目链接:二叉树剪枝

一、题目解析

题目要求删除原二叉树中,不包含1的子树,即子节点全为0子树


示例2中非常明确的表示了需要被删除的子树的两种情况:

  1. 左右子节点均为0且本身也为0
  2. 为叶节点

因此,对于每一个节点,我们都需要知道其左右子节点的情况,再结合自身的val,才可以判断是否将该子树删除。

二、算法原理

对于二叉树,自然可以使用递归来解决。

根据题目解析后得到的大致思路,我们需要:

  • 先知道某个节点的左右子节点的情况,
  • 再结合自身的val

才能判断是否删除以该节点为根的子树。

整个思路其实就是二叉树的后序遍历:

  • 先检查左节点
  • 再检查右节点
  • 最后查看自身的val

不妨后序遍历二叉树模拟一下整个过程:

  • 从根节点1开始,先判断其左子节点
  • 走到第一层根节点1的左子节点0处,对于该节点也需要先判断其左子节点
  • 走到第二层节点0的左子节点0处,对于该节点也需要先判断其左子节点
  • 走到第三层节点0的左子节点null处,由于空节点无法操作,此时返回上一层
  • 返回到第三层节点0处,接着判断其右子节点
  • 走到第三层节点0的右子节点null处,同样该节点为空,返回上一层
  • 返回到第三层节点0处,然后判断其val,发现为0,此时该节点满足了"左右子节点均为空且val为0"的条件,故将该节点删除,返回null
  • 返回到第二层节点0处,接着判断其右节点
  • 走到第二层节点0的右子节点0处,对于该节点也需要判断其左右子节点,这里省略,该节点被删除,返回null
  • 返回的第二层节点0处,然后判断其val,发现为0,此时该节点满足条件,故删除该节点,返回null
  • 返回到第一层根节点1处,接着判断其右子节点
  • 走到第一层根节点1的右子节点1处,对于该节点也需要判断其左子节点
  • 走到第二层节点1的左子节点0处,对于该节点也需要判断其左右子节点,该节点满足删除条件,故删除该节点,返回null
  • 返回到第二层节点1处,接着判断其右子节点
  • 走到第二层节点1的右子节点处,对于该节点也需要判断其左右子节点,该节点的左右子节点均为空,但是其val不为0,故不将该节点删除,返回该节点地址
  • 返回到第二层节点1处,此时其左子节点为空(已被删除)但右子节点不为空,且其val不为0,故不将该节点删除,返回该节点地址
  • 返回到第一层根节点1处,此时其左子节点为空(已被删除)但右子节点不为空,且其val不为0,故不将该节点删除,返回该节点地址
  • 遍历完成

三、代码实现

根据算法原理,我们设计函数头只需要一个参数------根节点地址,即可。

函数体只需要按照后序遍历来设计就可以了。

递归出口是当遇到空节点时,返回null。

代码如下:

Java 复制代码
class Solution {
    public TreeNode pruneTree(TreeNode root) {
        // 递归出口
        if (root == null) return null;

		// 递归(后序)
		root.left = pruneTree(root.left);
		root.right = pruneTree(root.right);
	
		// 返回
		if (root.left == null && root.right == null && root.val == 0)
		    root = null;
		return root;
    }
}

相关推荐
Swift社区11 小时前
LeetCode 401 二进制手表 - Swift 题解
算法·leetcode·swift
eSsO KERF11 小时前
MS SQL Server partition by 函数实战三 成绩排名
java
Darkwanderor11 小时前
搜索优化——启发式搜索和A*算法
c++·算法·启发式搜索·a星搜索
Master_oid12 小时前
机器学习37:K邻近算法(K Nearest Neighbor,KNN)
人工智能·算法·机器学习
承渊政道12 小时前
【优选算法】(实战突破字符串:经典题型与解题模板)
c语言·数据结构·c++·笔记·学习·算法·容器
STLearner12 小时前
WWW 2026 | 时间序列(Time Series)论文总结(预测,生成,插补,分类,异常检测等)
论文阅读·人工智能·深度学习·神经网络·算法·机器学习·数据挖掘
w61001046612 小时前
图论总结-day66
数据结构·算法·深度优先·图论
姗姗的鱼尾喵12 小时前
Java 并发编程高频面试题(含AQS/线程池/锁)
java·经验分享·面试
memcpy012 小时前
LeetCode 3634. 使数组平衡的最少移除数目【排序+滑动窗口】1453
算法·leetcode·职场和发展
被放养的研究生12 小时前
算法比赛用到的函数或模块(Python)
windows·python·算法