二叉树剪枝 · 8 月更文挑战

112 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第29天,点击查看活动详情

一、题目描述:

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

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

节点 node 的子树为 node 本身加上所有 node 的后代。

示例 1:

img

输入:root = [1,null,0,0,1] 输出:[1,null,0,null,1] 解释: 只有红色节点满足条件“所有不包含 1 的子树”。 右图为返回的答案。 示例 2:

img

输入:root = [1,0,1,0,0,0,1] 输出:[1,null,1,null,1] 示例 3:

img

输入:root = [1,1,0,1,1,0,1,0] 输出:[1,1,0,1,1,null,1]

提示:

树中节点的数目在范围 [1, 200] 内 Node.val 为 0 或 1

来源:力扣(LeetCode) 链接:leetcode.cn/problems/bi… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

用一个DFS式的函数来判断某一个节点是否可剪。 如果根为0,左右皆可剪,那么返回null,整个树都干掉 如果左可剪,左子置为null,否则递归处理左子树 如果右可剪,右子置为null,否则递归处理右子树 返回根节点

三、AC 代码:

class Solution {
    public TreeNode pruneTree(TreeNode root) {
        return dfs(root);
    }
    //dfs函数的含义是传入当前节点,返回去除0后的节点
    private TreeNode dfs(TreeNode root){
        //output of dfs
        if(root==null){
            return null;
        }
        //叶子节点的情况
        if(root.left==null&&root.right==null){
            if(root.val==0){
                return null;
            }else if(root.val==1){
                return root;
            }
        }
        //后序遍历
        root.left=dfs(root.left);
        root.right=dfs(root.right);
        //当后序遍历完,发现当前节点的左右孩子都是null并且当前节点的值是0的情况下,返回null
        if (root.left==null&&root.right==null&&root.val==0){
            return null;
        }
        return root;        
    }
}

四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐

希望对你有帮助

期待下次再见~

🌇 点赞 👍 收藏 ⭐留言 📝 一键三连 ~关注从你我做起!