数据结构之二叉树由浅入深(四)

目录

题外话

正题

第一题

第一题思路

第一题代码详解

第二题

第二题思路

第二题代码详解

第三题

第三题思路

第三题代码及详解

第四题

第四题思路

第四题代码及详解

第五题

第五题思路

第五题代码及详解


题外话

本来昨天就想写完这篇文章,怎么样是不是很大胆?

一天写完三篇文章,所有人都很震惊!

但是因为个人感情原因,昨晚实在没心思写,包括我现在也是想东想西

但是这并不影响我更好的写下这篇文章

正题

今天依然是完成二叉树练习题,二叉树这块练习题也蛮多的,但是就是对二叉树性质和递归熟练掌握,没有别的

第一题

给定一个二叉树,判断它是否是平衡二叉树(所有结点子树高度差小于1)

第一题思路

先思考,想判断一棵二叉树是不是平衡二叉树,需要哪些操作

1.获取所有结点左右子树高度

2.获取所有结点左右子树高度的同时,求高度相减绝对值

第一题代码详解

//判断一棵二叉树是不是平衡二叉树

public boolean isBalanced(TreeNode root) {

//树没有结点,当做平衡二叉树

 if (root==null)

        {

            return true;

        }

//最后返回获取二叉树高度中是否满足平衡二叉树即可,不满足一定等于-1

      return getHeight(root)!=-1;

    }

//获取所有结点子树高度,并计算所有结点左右子树高度差

public int getHeight(TreeNode root)

    {

//结点为空,返回0

        if (root==null) {

            return 0;

        }

//将左右子树递归,并创建整型变量接收

        int left=getHeight(root.left);

        int right=getHeight(root.right);

//判断左子树右子树大于等于0的同时,计算左右子树高度差绝对值是否满足平衡二叉树条件

        if(left>=0&&right>=0&&Math.abs(left-right)<=1)

        {

//满足则返回二叉树高度

        return left>right?left+1:right+1;

        }

        else{

//不满足返回-1

            return -1;

        }

    }

第二题

给你一个二叉树的根节点root , 检查它是否轴对称。

第二题思路

我们需要注意几个问题

1.根的左子树和根右子树相等

2.根结点的左子树的左子树和根节点的右子树的右子树相等

3.根节点的左子树的右子树和根节点的右子树的左子树相等

4.左子树为空,右子树不为空时,左子树不为空,右子树为空时

第二题代码详解

public boolean isSymmetric(TreeNode root) {
    if (root==null)
    {
        return true;
    }
//直接返回根的左子树和根的右子树的对称性判断结果即可
    return isSymmetricChild(root.left,root.right);


}

public boolean isSymmetricChild(TreeNode leftTree,TreeNode rightTree)
{
//首先判断左子树不为空,右子树为空和左子树为空,右子树不为空,这些都不是对称,返回false
    if (leftTree!=null&&rightTree==null||leftTree==null&&rightTree!=null)
    {
        return false;
    }
//当左子树和右子树都为空时是对称的,返回true
    if (leftTree==null&&rightTree==null)
    {
        return true;
    }
//当左子树和右子树的val值不一样,直接返回false
    if (leftTree.val!=rightTree.val)
    {
        return false;
    }
//最后再判断左子树的左子树和右子树的右子树是否相等,左子树的右子树和右子树的左子树是否相等即可
   return isSymmetricChild(leftTree.left,rightTree.right)&& isSymmetricChild(leftTree.right,rightTree.left);

}

第三题

编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。

第三题思路

首先,我们只有一个先序遍历的字符串,我们需要几个操作

1.把字符串输入,

2.先把字符串中的每个字符放入字符型变量中

3.把字符变量按照先序顺序构造二叉树

4.中序遍历打印二叉树

第三题代码及详解

public class Main {

//创建一个静态变量i

 public static int i=0;

    public static void main(String[] args) {

//输入字符串

    Scanner in=new Scanner(System.in);

        while (in.hasNextLine())

        {

//将先序遍历的字符串放入str

            String str=in.nextLine();

//将字符串以先序遍历创建二叉树

            TreeNode root=createTree(str);

//让二叉树中序遍历输出

            inorder(root);

        }

    }

    public static TreeNode createTree(String str){

  //创建一个根root;

        TreeNode root=null;

//将字符串从0开始转换成字符型,如果不是'#'就传给root,i自加1,然后递归,字符依次放入左子树,和右子树

        if (str.charAt(i)!='#')

        {

          root=new TreeNode(str.charAt(i));

            i++;

           root.left=createTree(str);

           root.right=createTree(str);

        }

        else {

//如果是'#',i++往下遍历

            i++;

        }

//最后返回根节点

        return root;


 

    }

//中序遍历打印

    public static void inorder(TreeNode root)

    {

//如果根为空直接返回即可

    if (root==null)

    {

        return ;

    }

//以左子树,根右子树的顺序递归遍历打印即可

        inorder(root.left);

        System.out.print(root.val+" ");

        inorder(root.right);

    }

}

第四题

给你二叉树的根节点root ,返回其节点值的层序遍历 。 (即逐层地,从左到右访问所有节点)

第四题思路

这道题是将根结点,根的左子树,根的右子树先依次放入队列中,借助队列先进先出原则,从而实现层序遍历

遍历的同时把结点一层一层的放入List<List<Interage>>中

List<List<Interage>>相当于一个二维数组,之前杨辉大三角那篇讲过

第四题代码及详解

public List<List<Integer>> levelOrder(TreeNode root) {
//先建立相当于二维数组的ret
    List<List<Integer>> ret=new ArrayList<>();

    if (root==null)
    {
        return ret;
    }
//建立队列q
    Queue<TreeNode> q=new LinkedList<>();
//先将根结点放入q
    q.offer(root);
//当q不为空
    while (!q.isEmpty())
    {
//建立相当于一维数组的tmp
        List<Integer> tmp=new ArrayList<>();
//获取q中元素数量
        int size=q.size();
//创建cur变量进行保存出列元素和获取出列元素左右子树
        TreeNode cur=null;
//当元素数量不等于0
      if (size!=0)
      {
//把出列元素放入cur
           cur=q.poll();
//出列元素值放入tmp,以便放入ret中
          tmp.add(cur.val);
//队列元素减1
          size--;
      }
//打印出列元素值
        System.out.print(cur.val+" ");
//如果出列元素左子树不为空,就把出列元素的左子树放入q中
        if (cur.left!=null)
        {
            q.offer(cur.left);
        }
//如果出列元素右子树不为空,就把出列元素的右子树元素放入q中
        if (cur.right!=null)
        {
            q.offer(cur.right);
        }
//每层结束执行需要把当前层出列的元素tmp放入ret
        ret.add(tmp);
    }
//循环结束,每层元素值都保存在ret中,返回ret
    return ret;

}

第五题

判断一个树是不是完全二叉树(层序遍历)

第五题思路

这道题和第四题都差不多,利用队列先进先出原则,

完全二叉树用队列层序遍历每个元素之间不可能有空值,

换句话说两个元素之间有空值就说明不是完全二叉树,如果null出列开始后又有元素出列,则说明不是完全二叉树

第五题代码及详解

boolean isCompleteTree(TreeNode root)
{
//创建队列q
    Queue<TreeNode> q=new LinkedList();
//将根节点放入q中
    q.offer(root);
//如果q为空
    while (!q.isEmpty())
    {
//建立变量cur接收出列元素
        TreeNode cur=q.poll();
//只要出列的元素不是null
       if (cur!=null)
       {
//就把cur的左子树右子树放入q中
           q.offer(cur.left);
           q.offer(cur.right);
       }
//如果出列是null,则退出循环
       else {
           break;
       }
    }
//如果q不为空队列
    while (!q.isEmpty())
    {
//先查看对头元素,判断队头元素是不是null,如果是null则出列
        TreeNode tmp=q.peek();
        if (tmp==null)
        {
            q.poll();
        }
//如果出列循环时遇到了不为null的元素则说明不是完全二叉树返回false
        else {
            return false;
        }
    }
//队列出完了,空了说明是完全二叉树,返回true
    return true;
}

小结

今天状态确实不太好

送给大家一句话

如果真相带来痛苦,那么谎言只是雪上加霜.(泪目!!)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/502085.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

ttkbootstrap界面美化系列之Notebook(四)

在简单的界面设计中&#xff0c;Notebook也是常用的组件之一&#xff0c;Notebook组件的引入可以根据标签来切换不同的界面。使得界面更有层次感&#xff0c;不必都挤在一个界面上。在tkinter中就有Notebook组件&#xff0c;在ttkbootstrap中&#xff0c;同样也对Notebook进行了…

Flutter开发之objectbox

Flutter开发之objectbox 在之前进行iOS开发的时候使用WCDB去进行管理数据库很方便&#xff0c;它支持ORM&#xff08;Object-Relational Mapping&#xff0c;对象关系映射&#xff09;&#xff0c;用于实现面向对象编程语言里不同类型系统的数据之间的转换。 那么在Flutter开发…

d3dcompiler_43.dll丢失的解决方法,快速解决win10系统错误问题

当系统提示“d3dcompiler_43.dll缺失”时&#xff0c;意味着计算机中缺少这一关键性动态链接库文件。该文件作为DirectX 3D编译器组件的一部分&#xff0c;对于许多依赖于DirectX技术的应用程序或游戏至关重要。这个错误通常会导致游戏或应用程序无法正常运行。为了解决这个问题…

java Web洗衣店管理系统用eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP 洗衣店管理系统是一套完善的web设计系统&#xff0c;对理解JSP java 编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发&#xff0c;数据库为Mysql5.0&#xff0c;使用…

记一次dubbo provider获取不到dubbo.tag问题排查

1. 背景 项目里通过dubbo.taggray传递灰度标&#xff0c;但是上游consumer已经在attachment里面设置dubbo.gray了&#xff0c;下游却拿不到 2. 排查过程 2.1. 前提 先把源码下载下来&#xff0c;方便排查 详细可见&#xff1a;tps://blog.csdn.net/qq_26012495/article/det…

9、jenkins微服务持续集成(一)

文章目录 一、流程说明二、源码概述三、本地部署3.1 SpringCloud微服务部署本地运行微服务本地部署微服务3.2 静态Web前端部署四、Docker快速入门一、流程说明 Jenkins+Docker+SpringCloud持续集成流程说明 大致流程说明: 开发人员每天把代码提交到Gitlab代码仓库Jenkins从G…

烟草行业率先布局新质生产力,中国烟草11省40家公司已上线实在Agent数字员工

为了更好赋能烟草行业数智化转型发展需求&#xff0c;各地烟草集团公司都开始陆续展开数智化赋能培训。近日&#xff0c;杭州烟草临安分公司举办“人工智能作为企业新质生产力发展的落地探索”论坛会议&#xff0c;实在智能受邀出席&#xff0c;聚焦“TARS大模型及实在Agent数字…

武汉星起航:引领跨境电商新潮流,一站式服务助合作伙伴成功起航

武汉星起航电子商务有限公司是一家集自营亚马逊跨境电商与亚马逊卖家孵化服务于一体的公司。在创始人张振邦先生的引领下&#xff0c;公司凭借深厚的电子商务运营经验和对行业的深刻洞察&#xff0c;积极响应国家大力发展跨境电商行业的号召&#xff0c;为刚起步和未起步的合作…

vue3封装Element表格自适应

表格高度自适应 分页跟随表格之后 1. 满屏时出现滚动条 2. 不满屏时不显示滚动条 坑 表格设置maxHeight后不出现滚动条 解决方案 表格外层元素设置max-height el-table–fit 设置高度100% .table-box {max-height: calc(100% - 120px); } .el-table--fit {height: 100%; }示例代…

会声会影剪刀为什么灰色 会声会影分割素材的方法 会声会影视频制作教程 会声会影2023旗舰版下载 会声会影快捷键

会声会影是一款操作简单&#xff0c;功能齐全&#xff0c;适合新手使用的视频剪辑软件。在使用会声会影剪辑的过程中&#xff0c;我们一般需要使用【剪刀工具】&#xff0c;但有时会声会影剪刀是灰色无法使用的状态&#xff0c;这个时候该怎么办呢&#xff1f;本文将为大家介绍…

pytest--python的一种测试框架--简介

一、什么是接口测试 接口测试是软件测试的一种类型&#xff0c;用于验证不同软件系统之间的接口是否按照设计规范进行通信和交互。接口测试通常涉及以下方面&#xff1a; 功能性验证&#xff1a;确认接口按照规范执行预期的功能。 性能测试&#xff1a;验证接口在不同负载条…

木地板 VS 瓷砖,不同风格应该怎么选?福州中宅装饰,福州装修

不同装修风格应该怎么选择地板铺贴材质&#xff1f;是选择木地板还是瓷砖&#xff1f;以下分点阐述&#xff1a; ①现代简约风格 推荐使用瓷砖。因为瓷砖的表面光滑&#xff0c;能反射出灯光的倒影&#xff0c;营造出简洁明亮的视觉效果。同时&#xff0c;瓷砖耐磨、易清洁&am…

CNN卷积神经网络股票价格预测

部分代码&#xff1a; %% 清空环境变量 warning off % 关闭报警信息 close all % 关闭开启的图窗 clear % 清空变量 clc % 清空命令行 %% 重构数据 data_Trend xlsread("dataguOne.xlsx") dT …

idea-创建java8的springboot项目

现在使用IDEA创建 Spring Boot 项目&#xff0c;jdk 版本最低要求为 17。Spring Boot 官方在全力维护 3.x 版本&#xff0c;而 Spring Boot 3.x 对 jdk 版本的最低要求为17。 如果需要继续使用 jdk8&#xff0c;则需要修改 Server URL &#xff0c;改成&#xff1a;https://st…

electron的学习基础汇总

通过学习electron了解一下做项目中好奇的问题&#xff0c;我觉得下面这张图就可以说明一切了&#xff0c;就是在初次创建并显示主窗口后&#xff0c;一切都将建立在渲染进程和主进程的通信上&#xff0c;而用的技术就是ipcMain和ipcRender&#xff0c;那么渲染进程如何与主进程…

X-Bogus逆向分析(纯算+补环境)

声明 本文章中所有内容仅供学习交流&#xff0c;抓包内容、敏感网址、数据接口均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff0c;若有侵权&#xff0c;请联系我立即删除&#xff01; 前言 此平台 本人 仅限…

储能逆变器测试负载箱解决方案

储能逆变器是新能源领域的重要设备&#xff0c;其性能的优劣直接影响到整个系统的运行效率和稳定性。因此&#xff0c;对储能逆变器进行严格的测试和验证是保证其性能的关键步骤。在这个过程中&#xff0c;负载箱是必不可少的工具&#xff0c;它可以模拟真实的负载条件&#xf…

JUC并发编程——对于synchronized关键字的理解

现象&#x1f50d;&#xff1a; 两个线程对初始值为 0 的静态变量一个做自增&#xff0c;一个做自减&#xff0c;各做 5000 次&#xff0c;最后输出的 counter一定为0 吗&#xff1f; Slf4j(topic "c.Test17") public class Test17 {static int counter 0;public…

可望而不可即的“人文关怀”

死亡既然是最后的归宿&#xff0c;生命的必然&#xff0c;自然也就没有必要过多地害怕了。一切顺其自然&#xff0c;交给“命运”就是了。 我参观过英国的临终关怀医院&#xff0c;这是世界上最早的一所临终关怀医院&#xff0c;已有100多年历史。 那里的大多数病人都只剩一个…

第1章.提示词:开启AI智慧之门的钥匙

什么是提示词&#xff1f; 提示词&#xff0c;是引导语言模型的指令&#xff0c;让用户能够驾驭模型的输出&#xff0c;确保生成的文本符合需求。 ChatGPT&#xff0c;这位文字界的艺术大师&#xff0c;以transformer架构为基石&#xff0c;能轻松驾驭海量数据&#xff0c;编织…