算法学习之二叉树系列小结

本文详细介绍了二叉树的各种算法,包括递归方式解决的二叉树最大深度、最小深度、直径、平衡二叉树、完全二叉树节点个数等问题,以及层次遍历、前中后序遍历。同时涵盖了BST操作如验证二叉搜索树、删除节点以及找到第K小元素的方法。通过实例解析解题思路,帮助理解二叉树的递归和遍历技巧。
摘要由CSDN通过智能技术生成

二叉树

递归

对于递归类型的题,首先是三点:

  1. 这个递归函数的功能是什么,怎样调用这个函数,即设计好递归函数的返回值参数列表
  2. 什么时候应该结束这个递归,它的边界条件(出口)是什么 (边界条件)
  3. 在非边界情况时,怎样从第n层转变成第n+1层 (递推公式)

递归的一个非常重要的点就是:不去管函数的内部细节是如何处理的,我们只看其函数作用以及输入与输出

104. 二叉树的最大深度

给定一个二叉树,找出其最大深度。二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。
说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],
    3
   / \
  9  20
    /  \
   15   7
返回它的最大深度 3

解题思路:

  1. 明确这个函数的抽象意义,参数列表。调用了maxDepth方法后,他返回的结果是int类型,代表当前传入进去这个节点的高度
  2. 边界就是当这个传入的节点(即root)为null的时候,应该返回的高度为0。
  3. 获取最大高度,对于当前这个节点来说,就是这个节点左节点的高度和右节点的高度的最大值+1;
class Solution {
   
    public int maxDepth(TreeNode root) {
   
        if(root == null) return 0;	//边界条件
        return Math.max(maxDepth(root.left),maxDepth(root.right)) + 1;	//获取最大值
    }
}
111.二叉树的最小深度

给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。
说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

    3
   / \
  9  20
    /  \
   15   7
返回它的最小深度  2.

解题思路:
这个题和最大深度一样,都是求左子树的深度和右子树的深度,但是有一个特殊情况就是当左子树的什么或者右子树的深度为0的时候,就只有一半的树了。

class Solution {
   
    public int minDepth(TreeNode root) {
   
        if(root == null) return 0;
        int left = minDepth(root.left);
        int right = minDepth(root.right);
        if(left == 0 || right == 0) return left + right + 1;	//特判
        return Math.min(left,right) + 1;
    }
}
543. 二叉树的直径

给定一棵二叉树,你需要计算它的直径长度。一棵二叉树的直径长度是任意两个结点路径长度中的最大值。这条路径可能穿过也可能不穿过根结点。
示例 :

给定二叉树

          1
         / \
        2   3
       / \     
      4   5    
返回 3, 它的长度是路径 [4,2,1,3] 或者 [5,2,1,3]。

解题思路:
根据每次递归获得左右子树的深度和来修改max,从而获得最大直径。找路径还有一道题解法大致一样687. 最长同值路径

class Solution {
   
    int max = 0;	
    public int diameterOfBinaryTree(TreeNode root) {
   
        if(root == null) return 0;
        depth(root);
        return max;
    }
    public int depth(TreeNode root){
   
        if(root == null) return 0;
        int left = depth(root.left);
        int right = depth(root.right);
        max = Math.max(max, left + right);	//更新最大直径
        return Math.max(left, right) + 1;	//求树的高度
    }
}
110. 平衡二叉树

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

    3
   / \
  9  20
    /  \
   15   7

解题思路:
对于这种类型的题,我们需要判断每一个节点的左右节点的高度差是否不超过1,所以可以借助一个辅助函数求高度。

class Solution {
   
    public boolean isBalanced(TreeNode root) {
   
        if(root == null) return true;
        //求高度差,并递归它的左节点和右节点
        return Math.abs(high(root.left) - high(root.right)) <= 1 
        		&& isBalanced(root.left) && isBalanced(root.right);	
    }

    public int high(TreeNode root){
   	//求每个节点的高度
        if(root == null) return 0;
        return Math.max(high(root.left), high(root.right)) + 1;
    }
}
222. 完全二叉树的节点个数

给出一个完全二叉树,求出该树的节点个数。

说明:
完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

示例:

输入: 
    1
   / \
  2   3
 / \  /
4  5 6

输出: 6

解题思路:

  1. 常规解法:直接递归遍历
  2. 大佬解法
class Solution {
   
    public int countNodes(TreeNode root) {
   
        if(root == null) return 0;

        int left = high(root.left);
        int right = high
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值