题目链接: LeetCode582二叉树剪枝.
题目描述
解题思路
采用dfs遍历每个节点的子树,如果其子树中出现了1,以该节点为根的树不删除;如果其左子树和右子树都不包含1,且该节点值为0,那么删除该节点。注意,这里说的"删除",是指改变该节点的父节点的指向,比如该节点是其父节点的左孩子,满足左右子树均不含1且自身的val为1,那么该节点的父节点的的left就指向null即可。还要注意,为什么不能直接将该节点置为null?因为Java的函数参数传递方式只有一种:值传递。基本数据类型是值传递不用多说,引用数据类型也是值传递,只不过是复制的引用,通过引用对内存中的数据进行操作。如果把该节点的引用置为null,只不过是把这个节点的指向改变成了null而已,对原二叉树毫无影响。而虽然其parent也是引用,但是通过parent这个引用就能改变对应内存中的数据,比如left和right的指向。废话不多说,上代码:
class Solution {
public TreeNode pruneTree(TreeNode root) {
dfs(root.left,root);
dfs(root.right,root);
if(root.left==null&&root.right==null&&root.val==0)
return null;
return root;
}
public boolean dfs(TreeNode root,TreeNode parent){
if(root==null)
return false;
boolean hasOne=root.val==1?true:false;
boolean leftHasOne=dfs(root.left,root);
boolean rightHasOne=dfs(root.right,root);
if(hasOne||leftHasOne||rightHasOne){
return true;
}
else{
if(root==parent.left){
parent.left=null;
}
else
parent.right=null;
}
return false;
}
}