814. Binary Tree Pruning --Tree 的遍历

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

  

转载于:https://www.cnblogs.com/keepAC/p/9915359.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值