leetcode高频题笔记之二叉树的递归

本文详细探讨了如何运用递归高效地解决二叉树相关问题,涵盖普通二叉树和二叉搜索树(BST)两大类别,包括计算最大深度、最小深度、平衡状态、直径、同值路径等经典题目。通过递归策略,深入理解树的性质,并通过实例解析关键递归步骤,提升算法能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

树是天生的适合递归的数据结构,很多树的问题用递归都可以非常漂亮的解决,而迭代往往比较复杂。熟练使用递归解决下面的二十多个二叉树问题,就能更进一步掌握递归。

普通二叉树

104.二叉树的最大深度

在这里插入图片描述
子问题:左右子树中较高的高度作为当前树的高度

public class Solution {
   
    public int maxDepth(TreeNode root) {
   
        return root == null ? 0 : Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
    }
}

111.二叉树的最小深度

在这里插入图片描述
与二叉树的最大深度有所不同,如果子树为空,最小深度不为1,因为深度定义是到叶子节点的,所以需要处理子树为空的情况

public class Solution {
   
    public int minDepth(TreeNode root) {
   
        //空树返回0
        if (root == null) return 0;
            //一边树为空返回非空树高度+1
        else if (root.left == null && root.right != null) return minDepth(root.right) + 1;
        else if (root.left != null && root.right == null) return minDepth(root.left) + 1;
            //子树均为空或均不为空返回子树最小高度+1
        else return Math.min(minDepth(root.left), minDepth(root.right)) + 1;
    }
}

110.平衡二叉树

在这里插入图片描述
自顶向下
子问题:当前树的左右子树高度差小于2,且左右子树都是平衡二叉树

public class Solution {
   
    public boolean isBalanced(TreeNode root) {
   
        if (root == null) return true;
        //如果左右节点高度差小于1,且左右节点都是满足平衡的
        return Math.abs(maxDepth(root.left) - maxDepth(root.right)) < 2
                && isBalanced(root.left)
                && isBalanced(root.right);
    }

    private int maxDepth(TreeNode node) {
   
        return node == null ? 0 : Math.max(maxDepth(node.left), maxDepth(node.right)) + 1;
    }
}

自底向上

子问题:获取当前树的左右子树的高度,如果左右子树高度差大于1,设置全局的返回值为false,然后返回树的高度
因为压栈到叶子节点才开始返回,所以是自底向上的,省去了多次获取树的高度

public class Solution {
   
    private boolean res = true;

    public boolean isBalanced(TreeNode root) {
   
        maxDepth(root);
        return res;
    }

    private int maxDepth(TreeNode root) {
   
        if (root == null) return 0;
        //获取左右子树高度
        int left = maxDepth(root.left);
        int right = maxDepth(root.right);
        //如果发现不是平衡的了就设置为false;
        if (Math.abs(left - right) > 1) res = false;
        //返回树的高度
        return Math.max(left, right) + 1;
    }
}

543.二叉树的直径(两节点最大路径)

在这里插入图片描述
题意解释:
在二叉树中两个节点可以构成的最长路径
可以不通过根节点的情况
在这里插入图片描述

子问题:计算每棵子树的左右子树高度之和,最大值就是整棵树的最大值

和自底向上的求二叉树的高度的代码一致,只是每次获取左右子树高度后计算一个当前最大左右子树和

public class Solution {
   
    private int max = 0;

    public int diameterOfBinaryTree(TreeNode root) {
   
        dfs(root);
        return max;
    }

    private int dfs(TreeNode root) {
   
        if (root == null) return 0;
        //获取左右子树的高度
        int lefth = dfs(root.left);
        int righth = dfs(root.right);
        //获取左右子树和的最大值
        max = Math.max(max, lefth + righth);
        //返回树的高度
        return Math.max(lefth, righth) + 1;
    }
}

687.最长同值路径

在这里插入图片描述
思路同上一个题两节点最大路径,自底向上
子问题:求和当前值相等的左右子树的长度的和

public class Solution {
   
    private int path = 0;

    public int longestUnivaluePath(TreeNode root) {
   
        dfs(root);
        return path;
    }

    private int dfs(TreeNode root) {
   
        if (root == null) return 0;
        //和左子树值相同的串的长度
        int left = dfs(root.left);
        //和右子树值相同的串的长度
        int right = dfs(root.right);
        //和当前值相同的左子树长度
        int leftPath = root.left != null && root.val == root.left.val ? left + 1 : 0;
        //和当前值相同的右子树长度
        int rightPath = root.right != null && root.val == root.right.val ? right + 1 : 0;
        //比较当前节点的路径更新最长路径
        path = Math.max(path, leftPath + rightPath);
        //返回当前节点的最长串长度
        return Math.max(leftPath, rightPath)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值