刷题摘记

力扣 1080 https://leetcode.cn/problems/insufficient-nodes-in-root-to-leaf-paths/

 

我的做法之前在理解错题意上用了中序,其实应该把能够从叶子到根的路径 都走一遍

于是采用了先序排序,每次到达叶子节点的时候需要判断,到这个叶子节点的所有路径能不能大于limit

 

如下图的情况

 

如果limit=-1的话,其实100+200是可行的,但是由于-1000的节点存在,导致200走到-1000这条路不行了

所以这条路就得删除才行

所以一定要从叶子节点开始算才行!

这道题目自己也是参考了之前的伪链表头节点的做法去做的,因为可能最根节点 都会被删除

核心代码如下

/**
* 从叶子节点出发才行 要求做法从上往下
*
* @param root
* @param limit
* @return
*/
public TreeNode sufficientSubset(TreeNode root, int limit) {


   TreeNode head = new TreeNode();
   head.left = root;
   // inOrder(root, limit, head);
   preOrder(root, limit, head,0);

   return head.left;

}


private int preOrder(TreeNode root, int limit, TreeNode pre,int temp) {
   if (root == null) {
       return  -1;
  }


   boolean isLeaf=root.left==null&&root.right==null;

   int left = preOrder(root.left, limit, root, temp + root.val);
   int right = preOrder(root.right, limit, root, temp + root.val);



   int res=0;
//   当前已经走到了根节点 如果是叶子节点的话进行判断
   if (root.left==null&& root.right==null&&isLeaf){

   //   需要判断这个是否可行
       if (temp+root.val>=limit){
       //   保留
           res=1;
      }else {
       //   删掉
           if (pre.left==root){
               pre.left=null;
          }else {
               pre.right=null;
          }
           res=-1;
      }

  }else {
       //   如果有个子节点不行了,那么这个根节点也会收到牵连 整条路需要删掉,除非根节点还有其他路能走

       if (left==-1&&right==-1){
           //   两个地方都走不了了 需要删除这个节点
           if (pre.left==root){
               pre.left=null;
          }else {
               pre.right=null;
          }
           res=-1;
      }else {
       //   不删
           res=1;
      }

  }





   return res;

}

更好的做法

用了后序去做,其实后序做的方便点

我之前的后序在计算累计值的时候出现了问题

到一个叶子节点后,需要计算它的累计值是否到了阈值,到了就不用删了

然后需要将不用删了告诉父节点,让它不要删除自己,然后一层层往上面递归回去,一直到最根节点就行

posted @   故里oc  阅读(41)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示