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

news2024/11/27 8:46:13

目录

题外话

正题

第一题

第一题思路

第一题代码详解

第二题

第二题思路

第二题代码详解

第三题

第三题思路

第三题代码及详解

第四题

第四题思路

第四题代码及详解

第五题

第五题思路

第五题代码及详解


题外话

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

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

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

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

正题

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

第一题

给定一个二叉树,判断它是否是平衡二叉树(所有结点子树高度差小于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;
}

小结

今天状态确实不太好

送给大家一句话

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

力扣124---二叉树的最大路径和(DFS,Java)

目录 题目描述&#xff1a; 思路描述&#xff1a; 代码&#xff1a; 题目描述&#xff1a; 二叉树中的 路径 被定义为一条节点序列&#xff0c;序列中每对相邻节点之间都存在一条边。同一个节点在一条路径序列中 至多出现一次 。该路径 至少包含一个 节点&#xff0c;且不一…

在Arduino IDE中使用文件夹组织源文件和头文件

在Arduino IDE中使用文件夹组织源文件和头文件 如果你是一名Arduino爱好者&#xff0c;你可能会发现随着项目的复杂度增加&#xff0c;代码的管理变得越来越困难。在Arduino IDE中&#xff0c;你可以通过使用文件夹来更好地组织你的源文件和头文件&#xff0c;使得代码更加清晰…

标定系列——预备知识-OpenCV中与标定板处理相关的函数(四)

标定系列——预备知识-OpenCV中与标定板处理相关的函数&#xff08;四&#xff09; 说明记录棋盘格圆网格 说明 记录了OpenCV中与标定板处理相关的函数用法 记录 棋盘格 圆网格

Python 妙用运算符重载——玩出“点”花样来

目录 运算符重载 主角点类 魔法方法 __getitem__ __setitem__ __iter__ __next__ __len__ __neg__ __pos__ __abs__ __bool__ __call__ 重载运算符 比较运算符 相等 不等 ! 大于和小于 >、< 大于等于和小于等于 >、< 位运算符 位与 & 位…

这样使用ChatGPT,效率翻倍不是梦!四大秘诀公开

随着ChatGPT技术的不断革新&#xff0c;它在我们日常工作中扮演着越来越重要的角色。那么&#xff0c;我们该如何利用ChatGPT来解决工作难题呢&#xff1f; Q1&#xff1a;想要迅速获得ChatGPT的帮助&#xff0c;我们应如何提出问题&#xff1f; 以下是几条高效提问的建议&…

关于v114之后的chromedriver及存放路径

使用selenium调用浏览器时&#xff0c;我一直调用谷歌浏览器&#xff0c;可浏览器升级后&#xff0c;就会再次遇到以前遇到过的各种问题&#xff0c;诸如&#xff1a;1、怎么关闭浏览器更新&#xff1b;2、去哪儿下载chromedriver&#xff1b;3、114版本之后的驱动去哪儿下载&a…

我于窗中窥月光,恰如仰头见“链表”(Java篇)

本篇会加入个人的所谓‘鱼式疯言’ ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人…

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记15:PWM输出

系列文章目录 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记01&#xff1a;赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431&#xff08;HAL库开发&#xff09;——CT117E学习笔记02&#xff1a;开发环境安装 嵌入式|蓝桥杯STM32G431&#xff08;…

线程安全(二)--死锁

TOC 一:什么是死锁??? public class Demo1 {public static void main(String[] args) {Object lockernew Object();Thread threadnew Thread(()->{synchronized(locker){synchronized (locker){System.out.println("hello thread");}}});thread.start();} }上…

Facebook Horizon Worlds:打造数字世界的社交乐园

在数字化时代&#xff0c;社交媒体平台已经成为人们日常生活中不可或缺的一部分。而随着科技的不断发展&#xff0c;人们对于社交体验的需求也在不断演变。在这样的背景下&#xff0c;Facebook推出了全新的虚拟现实社交平台——Facebook Horizon Worlds&#xff0c;旨在打造一个…

3D数据格式导出工具HOOPS Publish如何生成高质量3D PDF?

在当今数字化时代&#xff0c;从建筑设计到制造业&#xff0c;从医学领域到电子游戏开发&#xff0c;3D技术已经成为了不可或缺的一部分。在这个进程中&#xff0c;将3D模型导出为3D PDF格式具有重要的意义。同时&#xff0c;HOOPS Publish作为一个领先的解决方案&#xff0c;为…

Android客户端自动化UI自动化airtest从0到1搭建macos+脚本设计demo演示+全网最全最详细保姆级有步骤有图

iOS客户端自动化UI自动化airtest从0到1搭建macosdemo演示-CSDN博客 一、基础环境 1. 安装jdk 选择jdk8 如果下载高版本 可能不匹配会失败 下载.dmg文件 苹果电脑 &#xff5c; macOS &#xff5c; jdk1.8 &#xff5c; 环境变量配置_jdk1.8 mac-CSDN博客 Java Downloads …

08-研发流程设计(上):如何设计Go项目的开发流程?

在Go 项目开发中&#xff0c;我们不仅要完成产品功能的开发&#xff0c;还要确保整个过程是高效的&#xff0c;代码是高质量的。 所以&#xff0c;Go 项目开发一定要设计一个合理的研发流程&#xff0c;来提高开发效率、减少软件维护成本。研发流程会因为项目、团队和开发模式…

Android 自定义坐标曲线图(二)

Android 自定义坐标曲线图_android 自定义曲线图-CSDN博客 继上一篇文章&#xff0c;点击折线图上的点&#xff0c;显示提示信息进行修改&#xff0c;之前通过回调&#xff0c;调用外部方法&#xff0c;使用popupwindow或dialog来显示&#xff0c;但是这种方法对于弹框显示的位…

【No.21】蓝桥杯组合数学|数位排序|加法计数原理|乘法计数原理|排列数|组合数|抽屉原理|小蓝吃糖果|二项式定理|杨辉三角|归并排序(C++)

组合数学 数位排序 【问题描述】 小蓝对一个数的数位之和很感兴趣,今天他要按照数位之和给数排序。当两个数各个数位之和不同时,将数位和较小的排在前面,当数位之和相等时,将数值小的排在前面。 例如,2022 排在 409 前面, 因为 2022 的数位之和是 6,小于 409 的数位 之和 13。…

Linux 系统快速安装 nginx (新手版)

1、安装所需依赖 yum -y install pcre pcre-devel gcc openssl openssl-devel zlib zlib-devel &#xff08;pcre&#xff1a; 包括 perl 兼容的正则表达式库 openssl&#xff1a; 支持安全传输协议https(和财务有关系的请求会走的协议) 创建运行用户、组 useradd -M -…

Docker实例

华子目录 docker实例1.为Ubuntu镜像添加ssh服务2.Docker安装mysql docker实例 1.为Ubuntu镜像添加ssh服务 (1)访问https://hub.docker.com&#xff0c;寻找合适的Ubuntu镜像 (2)拉取Ubuntu镜像 [rootserver ~]# docker pull ubuntu:latest latest: Pulling from library/ub…

JAVAEE之网络原理

1.IP地址 IP地址主要用于标识网络主机、其他网络设备&#xff08;如路由器&#xff09;的网络地址。简单说&#xff0c;IP地址用于定位主机的网络地址。 格式 IP地址是一个32位的二进制数&#xff0c;通常被分割为4个“8位二进制数”&#xff08;也就是4个字节&#xff09;&…

用户登录.java

分析&#xff1a; 1&#xff0c;用String来定义两个变量&#xff0c;记录正确的用户名和密码----->直接赋值得来 2&#xff0c;键盘录入用户名和密码------>new开辟空间得来&#xff0c;存的是地址值 他们直接用比较大小,必定不相同&#xff0c;需要用到String里面的方…

STM32CubeIDE基础学习-USART串口通信实验(中断方式)

STM32CubeIDE基础学习-USART串口通信实验&#xff08;中断方式&#xff09; 文章目录 STM32CubeIDE基础学习-USART串口通信实验&#xff08;中断方式&#xff09;前言第1章 硬件介绍第2章 工程配置2.1 工程外设配置部分2.2 生成工程代码部分 第3章 代码编写第4章 实验现象总结 …