https://leetcode.com/problems/binary-tree-pruning/description/
一颗树中有0和1的节点,要求删除所有可以被删除的0节点,直接看下图就明白了。
分析: 如果是叶子节点为0,那直接删除, 删除后 如果新的叶子节点 也是0 继续删除。。。
一开始陷入了如何删除叶子节点的方法上,因此 写了个特别ugly 的code。 定义了一个dummy 节点变成新的 root,然后从dummy 开始 后续遍历整个树,code 如下,还蛮有意思。
class Solution { public TreeNode pruneTree(TreeNode root) { TreeNode dummy = new TreeNode(1); dummy.left = root; post_order_dfs(dummy); return dummy.left; } private void post_order_dfs(TreeNode node){ if(node == null) return; post_order_dfs(node.left); post_order_dfs(node.right); if(node.left != null && node.left.val == 0 && node.left.left ==null && node.left.right ==null){ node.left = null; } if(node.right != null && node.right.val == 0 && node.right.left ==null && node.right.right ==null){ node.right = null; } } }
优化的解法,虽然简单,但值得回味:
class Solution { public TreeNode pruneTree(TreeNode root) { if(root == null) return null; root.left = pruneTree(root.left); root.right = pruneTree(root.right); if(root.val ==0 && root.left == null && root.right ==null) return null; return root; } }
dfs 分解过程, 假设tree 三个节点 : 1
/ \
0 1
dfs(1) : root 1.left = dfs(left 0) , root1.right = dfs(right 1) , if(.....) 不满足, return root(1)
dfs(left 0): left0. left = dfs(null) =null , left1.right = dfs(null) =null , if(....) 满足, 直接return null,因此 root1.left = null
dfs(right 1) right1.left = dfs(null) = null, right1.right = dfs(null)=null , if(....) 不满足, return right1 节点, 因此 root1.right = right 1
至此 dfs 结束,需要被删除的 left 0 返回了Null 被删除。