leetcode每日刷题之树篇(三)110平衡二叉树,104二叉树的最大深度,101对称二叉树,111二叉树的最小深度

前言

今天做了四个题,但是最大深度和最小深度的含义一样,所以就不进行记录了.今天的题目里面有两个比较好的地方,一个是平衡二叉树和对称二叉树.

一、平衡二叉树

在这里插入图片描述

题目描述

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

题目解析

我的思路是先设立一个函数得出左子树和右子树的高度判断以父节点的树是否是平衡二叉树,然后再调用原来函数判断两个子树是否是平衡二叉树

题目代码

class Solution {
    
    
    public boolean isBalanced(TreeNode root) {
    
    
        if(root == null){
    
    
            return true;
        }
        //这里主要包含子树高度不相差1,然后左子树为平衡二叉树,右子树也为平衡二叉树.
        return ((Math.abs(hight(root.left)-hight(root.right))<=1? true:false)&&(isBalanced(root.right))&&isBalanced(root.left));

    }
    //这个是用来求高度的函数
    public int hight(TreeNode root){
    
    
        if(root == null){
    
    
            return 1;
        }
        //需要加1,因为还有父节点
        return Math.max(hight(root.left),hight(root.right))+1;
    }
}

二、对称二叉树

在这里插入图片描述

题目描述

在这里插入图片描述

题目解析

这个题目的核心就是,判断对称的地方是否一样,就是最中间的节点是否一样,最外面的节点是否一样,我们需要构建一个函数,函数传入根节点的左孩子p和右孩子q.然后我们首先对比p和q的val,然后再判断p.left和q.right是否一样,然后再判断p.right和q.left.即可

题目代码

class Solution {
    
    
    public boolean isSymmetric(TreeNode root) {
    
    
         if (root == null){
    
    
             return true;
         }
         return  twoSamp(root.left , root.right);
    }
    public boolean twoSamp(TreeNode p,TreeNode q){
    
    
        if(p == null && q == null){
    
    
            return true;
        }
        if(p == null || q == null){
    
    
            return false;
        }
        //判断是否是镜像二叉树
        return (p.val == q.val) && twoSamp(p.left,q.right) && twoSamp(p.right,q.left);
    }
}

代码如下(示例):

data = pd.read_csv(
    'https://labfile.oss.aliyuncs.com/courses/1283/adult.data.csv')
print(data.head())

三、二叉树的最小深度

在这里插入图片描述

题目描述

在这里插入图片描述

题目解析

我做这个题目的思路就是计算出左子树和右子树的高度,然后返回最小值,但是我们需要注意的情况就是一方为空的话,我们就需要返回另一方的高度,比如一棵树只有两个节点,那么这个树的最大深度和最小深度都为2.

题目代码

class Solution {
    
    
    public int minDepth(TreeNode root) {
    
    
          if(root == null){
    
    
             return 0;
          }
          //特殊情况时
          if(root.right == null){
    
    
              return minDepth(root.left)+1;
          }
          //特殊情况时
          if(root.left == null){
    
    
              return minDepth(root.right)+1;
          }
          //返回两个中的最小的那个
          else return Math.min(minDepth(root.right),minDepth(root.left))+1;
          

    }
}

总结

今天对于递归的理解变的更加深刻,做树的题目开始有了自己的想法,开始有感觉了,希望可以早点征服树!

猜你喜欢

转载自blog.csdn.net/tan45du_yuan/article/details/108803878