力扣labuladong——一刷day47

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • [一、力扣993. 二叉树的堂兄弟节点](#一、力扣993. 二叉树的堂兄弟节点)
  • [二、力扣1315. 祖父节点值为偶数的节点和](#二、力扣1315. 祖父节点值为偶数的节点和)
  • [三、力扣1448. 统计二叉树中好节点的数目](#三、力扣1448. 统计二叉树中好节点的数目)
  • [四、力扣1469. 寻找所有的独生节点](#四、力扣1469. 寻找所有的独生节点)

前言


二叉树的递归分为「遍历」和「分解问题」两种思维模式,这道题需要用到「遍历」的思维。

一、力扣993. 二叉树的堂兄弟节点

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int depthX = -1, depthY = -1;
    boolean flag = true;
    public boolean isCousins(TreeNode root, int x, int y) {
        fun(root,1,x,y);
        if(flag == false){
            return false;
        }
        if(depthX == depthY){
            return true;
        }
        return false;
    }
    public void fun(TreeNode root, int depth, int x, int y){
        if(root == null){
            return ;
        }
        if(root.val == x){
            depthX = depth;
        }
        if(root.val == y){
            depthY = depth;
        }
        if(root.left != null && root.right != null){
            if((root.left.val == x || root.left.val == y) && (root.right.val == x || root.right.val == y)){
                flag = false;
            }
        }
        fun(root.left,depth+1,x,y);
        fun(root.right,depth+1,x,y);
    }
}

二、力扣1315. 祖父节点值为偶数的节点和

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int sum = 0;
    public int sumEvenGrandparent(TreeNode root) {
        fun(root, null, null);
        return sum;
    }
    public void fun(TreeNode root, TreeNode parent, TreeNode grandParent){
        if(root == null){
            return;
        }
        if(grandParent != null && grandParent.val % 2 == 0){
            sum += root.val;
        }
        fun(root.left, root, parent);
        fun(root.right, root, parent);
    }
}

三、力扣1448. 统计二叉树中好节点的数目

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    int count = 0;
    public int goodNodes(TreeNode root) {
        fun(root,Integer.MIN_VALUE);
        return count;
    }
    public void fun(TreeNode root, int preMax){
        if(root == null){
            return;
        }
        if(root.val >= preMax){
            preMax = root.val;
            count ++;
        }
        fun(root.left, preMax);
        fun(root.right, preMax);
    }
}

四、力扣1469. 寻找所有的独生节点

java 复制代码
/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */
class Solution {
    List<Integer> res = new ArrayList<>();
    public List<Integer> getLonelyNodes(TreeNode root) {
        fun(root);
        return res;
    }
    public void fun(TreeNode root){
        if(root == null){
            return;
        }
        if(root.left == null && root.right != null){
            res.add(root.right.val);
        }
        if(root.left != null && root.right == null){
            res.add(root.left.val);
        }
        fun(root.left);
        fun(root.right);
    }
}
相关推荐
To_OC7 小时前
LC 51 N 皇后:我以为难的是回溯,结果栽在了对角线下标
javascript·算法·leetcode
腻害兔7 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
2401_841495648 小时前
【操作系统】进程同步与互斥实验报告
c++·算法·操作系统·进程·并发·同步·互斥
码智社8 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖9 小时前
JDK 26 新特性详解
java·开发语言
马优晨9 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
爱刷碗的苏泓舒12 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
维天说12 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane199413 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端