美文网首页
[二叉树] 二叉树剪枝

[二叉树] 二叉树剪枝

作者: 铜炉 | 来源:发表于2021-03-06 21:44 被阅读0次

前言

剪枝操作是也算二叉树的一个基本操作之一,包括回溯算法等,剪枝的思想都是算法优化的一个重要考量,今天记录一下这道题。

题目

二叉树剪枝

给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。

返回移除了所有不包含 1 的子树的原二叉树。

( 节点 X 的子树为 X 本身,以及所有 X 的后代。)

题目拆解

这道题是一个剪枝的基本题目,没有太多复杂的逻辑,所以重点就放在剪枝的dfs上就好。

1、一趟深度优先
2、剪枝的判定是当前节点的所有子树中,有没有1,没有就剪掉,有就留着。

简单来说,这两步就够了,还有几个细节可能需要注意,当前节点的判断条件要根据子节点返回来确定,所以用后续遍历的结构来处理。

代码

class Solution {
    public TreeNode pruneTree(TreeNode root) {
        boolean dfs = dfs(root);
        if (!dfs) return null;
        return root;
    }

    boolean dfs(TreeNode node) {
        // 如果当前节点为null 返回false
        if (node == null) return false;
        // 先往下找
        // 如果不包含1,直接删掉
        boolean leftRes = dfs(node.left);
        if (!leftRes) node.left = null;
        boolean rightRes = dfs(node.right);
        if (!rightRes) node.right = null;

        // 如果左右子树中有1,当前节点不删除
        if(leftRes || rightRes) return true;
        // 如果左右子树都没有1,那么根据当前节点值是否等于1 决定返回结果.
        return node.val == 1;
    }
}

总结

这题也是少有的一次bugfree就通过的leecode题目,通过代码也可以看出来,逻辑并不复杂,可以整理一下当做剪枝的标准模板使用了。

相关文章

  • Leetcode 814. 二叉树剪枝

    题目 Leetcode-814:二叉树剪枝[https://leetcode.cn/problems/binary...

  • 814. 二叉树剪枝

    814. 二叉树剪枝 这题华师数据科学学院的机试题

  • 二叉树剪枝

    1. 题目描述 给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。返回移除了所有不包含 1...

  • 数据结构与算法-二叉树02

    二叉树的定义 二叉树的特点 二叉树的五中基本形态 其他二叉树 斜二叉树 满二叉树 完全二叉树图片.png满二叉树一...

  • [二叉树] 二叉树剪枝

    前言 剪枝操作是也算二叉树的一个基本操作之一,包括回溯算法等,剪枝的思想都是算法优化的一个重要考量,今天记录一下这...

  • 二叉树

    二叉树 高度 深度真二叉树 满二叉树 完全二叉树 二叉树遍历前序 中序 后序层序遍历 翻转二叉树 递归法...

  • 二叉树 基础操作

    二叉树的使用 二叉树结构 先序创建二叉树 DFS 先序遍历二叉树 中序遍历二叉树 后序遍历二叉树 BFS 层次遍历...

  • leetcode 二叉树剪枝

    给定二叉树根结点 root,此外树的每个结点的值要么是 0,要么是 1。返回移除了所有不包含 1 的子树的原二叉树...

  • 树与二叉树

    **树 ** 二叉树 满二叉树 完全二叉树 三种遍历方法 树与二叉树的区别 二叉查找树 平衡二叉树 红黑二叉树

  • 二叉树的宽度优先搜索(层次遍历,BFS)

    二叉树结构: 二叉树宽度优先搜索: 按照二叉树的层数依次从左到右访问二叉树的节点;例如:给定一个二叉树: 按照宽度...

网友评论

      本文标题:[二叉树] 二叉树剪枝

      本文链接:https://www.haomeiwen.com/subject/lmwsqltx.html