当前位置: 首页 > news >正文

【数据结构】——二叉树oj题详解

1、100. 相同的树 - 力扣(LeetCode)

 

 我们考虑它相同和不相同的情况,再用递归遍历:

完整代码:

public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p == null && q != null || p != null && q == null){
            return false;
        }
        if (p == null && q == null){
            return true;
        }
        if(p.val != q.val){
            return false;
        }
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
    }

2、572. 另一棵树的子树 - 力扣(LeetCode)

 

这道题,我们可以直接用上一道题的代码,其思路如下:

  1. 我们首先判断root和subRoot是不是两颗相同的树,是的话就返回true 
  2. 不是的话,就继续判断subRoot是不是root.left的左子树的子树或者root.left是不是和和subRoot为相同的树
  3. 同理再判断subRoot和root.right;

完整代码:

class Solution {
    //时间复杂度为:n * m
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p == null && q != null || p != null && q == null) {

            return false;
        }
        if(p == null && q == null) {
            return true;
        }
        if(p.val != q.val) {
            return false;
        }
        return isSameTree(p.left,q.left) && isSameTree(p.right,q.right);
    }
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if (root == null || subRoot == null){
            return false;
        }
        if (isSameTree(root,subRoot)){
            return true;
        }
        if(isSubtree(root.left,subRoot)){
            return true;
        }
        if(isSubtree(root.right,subRoot)){
            return true;
        }
        return false;
    }
}

3、110. 平衡二叉树 - 力扣(LeetCode)

 

 

思路:

  1.  首先这道题判断平衡也就是左右子树的高度差,那就需要求出左右子树的高度,,进行比较
  2. 然后还需要求出左子树的子树的高度差,和右子树的子树的高度差,来判断左子树和右子树是否平衡。
  3. 所以需要遍历树的每一个结点

 

完整代码:

class Solution {
    //时间复杂度为:n * n
    int getHeight(TreeNode root){
        if (root == null){
            return 0;
        }
        int leftTree = getHeight(root.left);
        int rightTree = getHeight(root.right);
        return leftTree > rightTree ? leftTree+1 : rightTree+1;
    }
    public boolean isBalanced(TreeNode root) {
        if(root == null){
            return true;
        }
        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);
        return Math.abs(leftHeight-rightHeight) <= 1 
        && isBalanced(root.left)
        && isBalanced(root.right);
    }
}

 上面的这种解法的时间复杂度是O(n^2),会出现大量的的重复计算,当计算根结点的左子树高度时,递归到数字九时返回一个2就已经说明了该树不平衡,所以我们从下向上计算高度时顺便判断一下,这样的话时间复杂度就是O(n)

class Solution {
    int getHeight(TreeNode root){
        if (root == null){
            return 0;
        }
        int leftHeight = getHeight(root.left);
        int rightHeight = getHeight(root.right);
        if(leftHeight >= 0 && rightHeight >= 0 && Math.abs(leftHeight - rightHeight) <= 1){
            return Math.max(leftHeight,rightHeight) + 1;
        }else{
            //返回-1 就说明已经出现了不平衡
            return -1;
        }
    }
    public boolean isBalanced(TreeNode root) {
        if(root == null){
            return true;
        }
        return getHeight(root) >= 0;
    }
}

4、101. 对称二叉树 - 力扣(LeetCode)

 思路就是判断root的左右子树是否对称:左子树的右树和右子树的左树是否相同:

class Solution {
    public boolean isSymmetric(TreeNode root) {
        if(root == null) {
            return true;
        }
        return isSymmetricChild(root.left,root.right);
    }
    private boolean isSymmetricChild(TreeNode leftTree,TreeNode rightTree) {
        //判断左子树的右树和右子树的左树是否相同.
        if (leftTree == null && rightTree != null || leftTree != null && rightTree == null){
            return false;
        }
        //是否都为空
        if (leftTree == null && rightTree == null){
            return true;
        }
        //判断val值
        if (leftTree.val != rightTree.val){
            return false;
        }
        //进行递归左子树的右树和右子树的左树
        return isSymmetricChild(leftTree.left, rightTree.right) &&
                isSymmetricChild(leftTree.right, rightTree.left);
    }
}

5、102. 二叉树的层序遍历 - 力扣(LeetCode)

思路:

  1. 首先要创建两个顺序表来分层存储二叉树
  2. 创建一个队列,先把根结点入对,再把top弹出的同时并赋值给cur并打印
  3. 并且把top的左右子树入队,直到树为空

 

 完整代码:

class Solution {
    public List<List<Integer>> levelOrder(TreeNode root) {
        List<List<Integer>> ret = new ArrayList<List<Integer>>();
        if(root == null){
            return ret;
        }
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);
        while(!queue.isEmpty()){
            List<Integer> leve = new ArrayList<Integer>();
            int queue_size = queue.size();
            for(int i = 0; i < queue_size; i++){
                TreeNode node = queue.poll();
                leve.add(node.val);
                if(node.left != null){
                    queue.offer(node.left);
                }
                if(node.right != null){
                    queue.offer(node.right);
                }
            }
            ret.add(leve);
        }
        return ret;
    }
}

 6、判断该树是否为完全二叉树

思路:

  1. 将null也入队,如果队列中只剩下null,说明就为完全二叉树
  2. 当非完全二叉树入队时,出队的时候会发现队列中还剩下null和结点

 

 完整代码:

boolean isCompleteTree(TreeNode root){
        if (root == null){
            return true;
        }
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        while (!queue.isEmpty()){
            TreeNode cur = queue.poll();
            if (cur != null){
                queue.offer(cur.left);
                queue.offer(cur.right);
            }else {
                break;
            }
        }
        while (!queue.isEmpty()){
            TreeNode cur = queue.peek();
            if (cur != null){
                //不是完全二叉树
                return false;
            }else {
                queue.poll();
            }
        }
        return true;
    }

相关文章:

  • 性能测试:工具篇:Jmeter实时可视化平台搭建
  • 你该用什么的美剧学英语?
  • 面试算法 二叉树的遍历,方法 :迭代 ,前序遍历: 中序遍历: 后序遍历: 层序遍历
  • Matlab常用函数(control)
  • 推荐10款好用的数据可视化工具,赶紧收藏
  • Java刷题面试系列习题(六)
  • 解决:vue-cli-service不是内部或外部命令
  • 手把手教你深度学习和实战-----全连接神经网络
  • VSCode 配置 C++ 环境
  • 2021年研究生数模B题论文记录
  • Golang高性能日志库zap + lumberjack 日志切割组件详解
  • java 相似度计算
  • Python和Nose实现移动应用的自动化测试
  • 各种框架的面试
  • 深信服Python笔试
  • [case10]使用RSQL实现端到端的动态查询
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • JavaScript设计模式系列一:工厂模式
  • mongodb--安装和初步使用教程
  • PAT A1092
  • Python_网络编程
  • Work@Alibaba 阿里巴巴的企业应用构建之路
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 关于字符编码你应该知道的事情
  • 基于Mobx的多页面小程序的全局共享状态管理实践
  • 前端_面试
  • 如何在 Tornado 中实现 Middleware
  • 通过git安装npm私有模块
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • 你学不懂C语言,是因为不懂编写C程序的7个步骤 ...
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​学习一下,什么是预包装食品?​
  • # Pytorch 中可以直接调用的Loss Functions总结:
  • #14vue3生成表单并跳转到外部地址的方式
  • #QT(TCP网络编程-服务端)
  • $jQuery 重写Alert样式方法
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (Git) gitignore基础使用
  • (Mac上)使用Python进行matplotlib 画图时,中文显示不出来
  • (附源码)ssm高校实验室 毕业设计 800008
  • (附源码)流浪动物保护平台的设计与实现 毕业设计 161154
  • (力扣记录)1448. 统计二叉树中好节点的数目
  • (七)Java对象在Hibernate持久化层的状态
  • (四)Controller接口控制器详解(三)
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)JAVA中的堆栈
  • (转)Mysql的优化设置
  • (转载)CentOS查看系统信息|CentOS查看命令
  • .NET 4 并行(多核)“.NET研究”编程系列之二 从Task开始
  • .NET 8.0 发布到 IIS
  • .NET Core WebAPI中使用swagger版本控制,添加注释
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NetCore部署微服务(二)
  • .net打印*三角形
  • .net实现头像缩放截取功能 -----转载自accp教程网