go语言leetcode训练 NO.814

题目:

给定二叉树根结点 root ,此外树的每个结点的值要么是 0,要么是 1。

返回移除了所有不包含 1 的子树的原二叉树。

( 节点 X 的子树为 X 本身,以及所有 X 的后代。)

示例1:
输入: [1,null,0,0,1]
输出: [1,null,0,null,1]

解释:
只有红色节点满足条件“所有不包含 1 的子树”。
右图为返回的答案。

示例2:
输入: [1,0,1,0,0,0,1]
输出: [1,null,1,null,1]


示例3:
输入: [1,1,0,1,1,0,1,0]
输出: [1,1,0,1,1,null,1]


本题依然是一个 递归函数+辅助函数 只不过辅助函数也是一个递归

思路:

观察发现 一个节点的val是0 而子树的节点中存在1,我们可就无法删除该节点的子树

所以我做了一个比喻   "挖金矿"   

把1当做金子 当开始挖掘(遍历)某一个节点的子树时,一旦发现该节点的子树存在金子(1)时,就不向下挖掘(遍历),开始返回挖掘点,告诉挖掘点 下面有金子(即: 存在1,不能删除该(左/右)子树)

当挖掘到底(遍历到叶子结点)时,仍未挖掘到金子(没有1),则返回挖掘层,没有金子(即: 不存在1,要删除该(左/右)子树)

以下是核心代码:

//Definition for a binary tree node.
  type TreeNode1 struct {
     Val int
     Left *TreeNode1
     Right *TreeNode1
  }
func printTree(node *TreeNode1){
   if node ==nil{
      return
   }

   printTree(node.Left)
   if has_zero(node.Left,true)==true{ //挖掘层   探测该node的左子树是否存在1 当存在1时,不能删除整个左子树
      node.Left = nil
   }

   printTree(node.Right)
   if has_zero(node.Right,true)==true{ //挖掘层   探测该node的右子树是否存在1 当存在1时,不能删除整个右子树
      node.Right = nil
   }
}

func  has_zero(node *TreeNode1,boolean bool)(bool){   //挖掘函数
   if boolean == false{
      return boolean
   }
   if node==nil{
      return boolean
   }else{
      if node.Val == 1 {    //发现层  当发现该树存在1的节点 则可以一直向上传递(传递层) 即: "跳出"has_zero递归
         boolean=false
         return boolean
      }
   }
   if node.Left!=nil {
      if has_zero(node.Left,boolean)==false{   //挖掘层
         boolean=false
         return boolean     //传递层 当得知boolean=false时(存在1节点) 就进行向上传递
      }
   }
   if node.Right!=nil{
      if has_zero(node.Right,boolean)==false{   //挖掘层
         boolean=false
         return boolean    //同上
      }
   }
   return boolean
}

func pruneTree(root *TreeNode1) *TreeNode1 {
   printTree(root)
   return root
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值