leetcode 814. 二叉树剪枝
给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。
返回移除了所有不包含 1 的子树的原二叉树。
( 节点 X 的子树为 X 本身,以及所有 X 的后代。)
示例1:
输入: [1,null,0,0,1]
输出: [1,null,0,null,1]
解释:
只有红色节点满足条件“所有不包含 1 的子树”。
右图为返回的答案。
示例2:
输入: [1,0,1,0,0,0,1]
输出: [1,null,1,null,1]
示例3:
输入: [1,1,0,1,1,0,1,0]
输出: [1,1,0,1,1,null,1]
说明:
给定的二叉树最多有 100 个节点。
每个节点的值只会为 0 或 1 。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/binary-tree-pruning
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
后序递归遍历二叉树,返回值为boolean类型。
若节点为null,返回true,表示可以删除此节点。
若节点的左右子节点都为true,并且本身的值为0,则表示以此节点为树的二叉树,都是由0构成的,需要删除。
/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */ class Solution { public TreeNode pruneTree(TreeNode root) { if (root == null) { return root; } find(root); if (root.val == 0 && root.left == null && root.right == null) { return null; } return root; } private boolean find(TreeNode node) { if (node == null) { return true; } boolean b1 = find(node.left); if (b1) { node.left = null; } boolean b2 = find(node.right); if (b2) { node.right = null; } return node.val == 0 && b1 && b2; } }