Description
Given the root of a binary tree, return the same tree where every subtree (of the given tree) not containing a 1 has been removed.
A subtree of a node node is node plus every node that is a descendant of node.
Examples
Example 1:
Input: root = [1,null,0,0,1]
Output: [1,null,0,null,1]
Explanation:
Only the red nodes satisfy the property “every subtree not containing a 1”.
The diagram on the right represents the answer.
Example 2:
Input: root = [1,0,1,0,0,0,1]
Output: [1,null,1,null,1]
Example 3:
Input: root = [1,1,0,1,1,0,1,0]
Output: [1,1,0,1,1,null,1]
Constraints:
The number of nodes in the tree is in the range [1, 200].
Node.val is either 0 or 1.
思路
树的题基本都使用递归,这道题是要删除所有 子树中不包含1 的树节点。
由于要进行删除操作,所以每次不是判断以当前节点为root的子树,而是分别判断
- 以当前节点的右孩子为root的子树
- 以当前节点的左孩子为root的子树
这两种情况
然后对需要删除的节点,通过currentNode.child=null的方式进行删除。
那什么是需要删除的情况呢?也就是怎么判断子树中包不包含1呢?
就直接看代码就行了,感觉逻辑还挺清楚的。
代码
/**
* 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 boolean hasOne(TreeNode root) {
if (root == null)
return false;
boolean right = true;
boolean left = true;
if (!hasOne(root.left)){
root.left = null;
left = false;
}
if (!hasOne(root.right)){
root.right = null;
right = false;
}
return root.val == 1 || left || right;
}
public TreeNode pruneTree(TreeNode root) {
boolean finalTree = hasOne(root);
if (finalTree)
return root;
else
return null;
}
}