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 被删除。 

  

posted on 2018-11-06 15:06  KeepAC  阅读(108)  评论(0)    收藏  举报