刷题摘记
力扣 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