探索二叉树的奇幻世界:解密二叉树的结构与遍历

news2024/10/7 10:46:40

文章目录

目录

一、二叉树的基本操作

1.1 获取树中节点的个数  

1.2 获取叶子节点的个数

1.3 获取第K层节点的个数

1.4 获取二叉树的高度

二、二叉树相关习题

2.1 检查两颗树是否相同

2.2 另一颗树的子树

2.3 翻转二叉树

2.4 判断一颗二叉树是否是平衡二叉树 


 一、二叉树的基本操作

public class TreeNode {
    static class treeNode{
        public char val;
        public treeNode left;       //储存左孩子的引用
        public treeNode right;      //储存右孩子的引用

        public treeNode(char val) {
            this.val = val;
        }
    }
    public treeNode creattree(){
        treeNode A=new treeNode('A');
        treeNode B=new treeNode('B');
        treeNode C=new treeNode('C');
        treeNode D=new treeNode('D');
        treeNode E=new treeNode('E');
        treeNode F=new treeNode('F');
        A.left=B;
        A.right=C;
        B.left=D;
        C.left=E;
        C.right=F;
        return A;
    }
}

函数creattree()用于创建一个简单的二叉树。函数中创建了六个treeNode对象,分别为ABCDEF。然后,将每个节点的左子节点和右子节点分别设置为BCDEEF,如下所示:

1.1 获取树中节点的个数  

//获取树中节点的个数
    public int size2(treeNode root) {
        if(root==null){
            return 0;
        }
        return size2(root.right)+size2(root.left)+1;
    }

    本章习题中很多都是采用递归的方法,求树中节点的个数一样,通过遍历二叉树的每个节点,计算叶子节点的数量。在递归过程中,函数会递归调 size2(root.left)和 size2(root.right),计算左子树和右子树的叶子节点数量。最终,函数返回叶子节点的数量,表示二叉树中叶子节点的数量。

1.2 获取叶子节点的个数

 public int getLeftCount2(treeNode root){
          if(root==null){
              return 0;
          }
          if(root.left!=null&&root.right!=null){
              return 1;
          }
          return getLeftCount2(root.left)+getLeftCount2(root.right);
}

 1.3 获取第K层节点的个数

//获取第K层节点的个数
    public int getLevelNodeCount(treeNode root,int key){
        if(root==null){
            return 0;
        }
        if(key==1){
            return 1;
        }
        return getLevelNodeCount(root.right,key-1)+getLevelNodeCount(root.left,key-1);
    }

1.4 获取二叉树的高度

//获取二叉树的高度
    public int getHeight(treeNode root){
        if(root!=null){
            return 0;
        }
        int rightH=getHeight(root.right);
        int leftH=getHeight(root.left);
        return Math.max(rightH,leftH)+1;
    }

二、二叉树相关习题

2.1 检查两颗树是否相同

class Solution {
    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.2 另一颗树的子树

借用2.1的方法判断两个树是否相同,

1、递归的过程树的根节点一直在变化,首先判断树是否为空

2、判断当前根节点是否与子树相同

3、分别用根节点的左子树和右子树分别判断是否与子树相同(注意:不用isSameTree的原因是isSameTree只会判断一次,就结束了)

class Solution {
    public boolean isSubtree(TreeNode root, TreeNode subRoot) {
        if(root==null){
            return false;
        }
        if(isSameTree(root,subRoot)) return true;
        if(isSubtree(root.right,subRoot))return true;
        if(isSubtree(root.left,subRoot))return true;
        return false;
    }
    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.3 翻转二叉树

思路:

        遍历二叉树的每个节点 ,使其左右节点进行互换,然后递归左右节点,返回根节点 

class Solution {
    public TreeNode invertTree(TreeNode root) {
        if(root==null){
            return null;
        }
        TreeNode p=root.left;
        root.left=root.right;
        root.right=p;
        invertTree(root.left);
        invertTree(root.right);
        return root;
    }
}

2.4 判断一颗二叉树是否是平衡二叉树

 

思路:

        1、借用1.4获取二叉树高度的函数

        2、遍历改树的每一个节点,求每个节点的的左子树和右子树高度的差是不是大于2,是则返回false

        3、若小于二&&左子树是不是平衡二叉树&&右子树是不是平衡二叉树

class Solution {
    public boolean isBalanced(TreeNode root) {
        if(root==null){
            return true;
        }
        int leftHight=getHeight(root.left);
        int rightHight=getHeight(root.right);
        return Math.abs(leftHight-rightHight)<2&&isBalanced(root.left)&&isBalanced(root.right);
    }
    public int getHeight(TreeNode root){
        if(root==null){
            return 0;
        }
        int leftHight=getHeight(root.left);
        int rightHight=getHeight(root.right);
        return Math.max(leftHight,rightHight)+1;
    }
}

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

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

相关文章

yolov11 部署瑞芯微rk3588、RKNN部署工程难度小、模型推理速度快

yolov8还没玩溜&#xff0c;yolov11又来了&#xff0c;那么部署也又来了。 特别说明&#xff1a;如有侵权告知删除&#xff0c;谢谢。 完整代码&#xff1a;包括onnx转rknn和测试代码、rknn板端部署C代码 【onnx转rknn和测试代码】 【rknn板端部署C代码】 1 模型训练 yolov1…

深度学习:词嵌入embedding和Word2Vec

目录 前言 一、词嵌入&#xff08;Embedding&#xff09; 1.传统自然语言处理问题 2.什么是词嵌入 二、Word2vec模型 1.Word2Vec的基本原理 三、CBOW模型训练过程 前言 在机器学习里的自然语言处理&#xff0c;是将语料库中的词语转换成词向量矩阵&#xff0c;再使用朴素…

远程调用的问题以及eureka原理

目录 服务调用出现的问题 问题分析 解决方案&#xff08;eureka原理&#xff09; eureka&#xff08;两个角色&#xff09; eureka的解决方案 此过程出现的问题 eureka的作用 总结 服务调用出现的问题 服务消费者该如何获取服务提供者的地址信息&#xff1f;如果有多个…

《黑神话:悟空》像素版 v0.1b [PC+安卓]

游戏简介 《黑神话&#xff1a;悟空》像素版是一款由火山哥哥与林学学LinkLin合作开发的游戏。这款游戏采用了像素化的艺术风格&#xff0c;巧妙地简化并再现了《黑神话&#xff1a;悟空》中的核心玩法和经典场景。游戏不仅成功复刻了原作中的战斗系统和角色动画&#xff0c;还…

FredNormer: 非平稳时间序列预测的频域正则化方法

时间序列预测是一个具有挑战性的任务,尤其是在处理非平稳数据时。现有的基于正则化的方法虽然在解决分布偏移问题上取得了一定成功但仍存在局限性。这些方法主要在时间域进行操作,可能无法充分捕捉在频域中更明显的动态模式,从而导致次优的结果。 FredNormer论文的研究目的主要…

AI大模型时代来了,35岁+程序员都去哪了?

在 AI 大潮中&#xff0c;AI 大模型如同一艘巨轮&#xff0c;引领着技术的前进方向。然而&#xff0c;随着这股浪潮的汹涌&#xff0c;人们开始关注那些35岁以上的程序员&#xff0c;在这个快速变化的时代中&#xff0c;面临着怎样的挑战和机遇&#xff1f;本文将带您深入了解程…

UART驱动学习二(TTY体系)

目录 一、TTY体系中设备节点的差别1. 傻傻分不清 /dev/tty*2. 要讲历史了2.1 电传机teletype2.2 计算机需要控制2.2.1 使用teletype2.2.2 teletype被淘汰了2.2.3 个人电脑和虚拟终端 3. tty相关设备节点3.1 各类设备节点的差别3.2 /dev/ttyN(N1,2,3,..., 63)3.3 /dev/tty03.4 /…

python数据分析与可视化介绍

本文主要讲述了数据可视化的基础知识&#xff0c;包括什么是数据可视化&#xff0c;数据可视化应用以及Python可视化工具库。 什么是数据可视化 可视化是一种通过视觉的方式有效传达信息的技术。数据可视化旨在借助于图形化手段&#xff0c;将数据以视觉形式来呈现&#xff0c…

什么样的孩子适合学C++?

随着科技的飞速发展&#xff0c;编程已成为许多家长和教育者重视的技能之一。在众多编程语言中&#xff0c;C因其强大的功能和广泛的应用&#xff0c;成为许多青少年学习编程的首选。然而&#xff0c;C相较于其他编程语言&#xff0c;如Python或Scratch&#xff0c;其学习难度更…

Golang | Leetcode Golang题解之第461题汉明距离

题目&#xff1a; 题解&#xff1a; func hammingDistance(x, y int) (ans int) {for s : x ^ y; s > 0; s & s - 1 {ans}return }

AutoSar CP 通信服务核心—Com模块详解

文章目录 Com模块的主要功能Com模块的配置与其他模块的交互应用举例应用层通过Com模块接收CAN报文应用层通过Com模块发送CAN报文 在AUTOSAR Classic Platform (CP) 中&#xff0c; Com模块&#xff08;Communication模块&#xff09;是负责实现 应用层与通信栈之间的接口。它…

Windows 通过 Docker 安装 GitLab

1. 安装 Docker Desktop 下载网站&#xff1a;Windows | Docker Docs 2. 拉取 GitLab Docker 镜像 打开 PowerShell 或 命令提示符&#xff0c;拉取 GitLab 镜像&#xff1a; docker pull gitlab/gitlab-ee:latest或则使用社区版&#xff1a; docker pull gitlab/gitlab-ce…

【五分钟学会】YOLO11 自定义数据集从训练到部署

数据集地址 数据集包含 360 张红血细胞图像及其注释文件&#xff0c;分为训练集与验证集。训练文件夹包含 300 张带有注释的图像。测试和验证文件夹都包含 60 张带有注释的图像。我们对原始数据集进行了一些修改以准备此 CBC 数据集&#xff0c;并将数据集分成三部分。在360张…

feign文件上传

记录一下 feign文件上传 环境 spring-boot 2.3.7 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.7.RELEASE</version><relativePath/> <!-- lo…

NIO实现聊天室之:一切都要从网络编程的基础开始聊起!

一、写在开头 大家好,Build哥回来啦!停更了大概2个月之久,之前有段时间去写小说去了,后来又因为公司活太多,牛马干的太投入,就拉下了博客的更新,国庆节期间,难得的闲下来,准备回归老本行啦。 大致的翻看了一下之前更新的内容,已经写到了Java的IO部分,作为网络传输…

通过 LLMs 自动探索量化投资策略

作者&#xff1a;老余捞鱼 原创不易&#xff0c;转载请标明出处及原作者。 写在前面的话&#xff1a; 本文提出了一个利用大型语言模型&#xff08;LLMs&#xff09;和多代理架构的新框架&#xff0c;用于量化股票投资和投资组合管理。该框架通过整合LLMs生成多样化的al…

SpringBoot项目:前后端打包与部署(使用 Maven)

文章目录 IDEA后端打包与部署&#xff08;使用 Maven&#xff09;1. 确保 Maven 已安装&#xff0c;并引入 pom 插件2. 清理并安装项目3. 定位生成的 JAR 包和配置文件4. 创建部署文件夹5. 上传到服务器 前端打包与部署&#xff08;使用 npm&#xff09;1. 确保 Node.js 和 npm…

提升LLM结果:何时使用知识图谱RAG

通过知识图谱增强 RAG 可以帮助检索&#xff0c;使系统能够更深入地挖掘数据集以提供详细的响应。 译自Boost LLM Results: When to Use Knowledge Graph RAG&#xff0c;作者 Brian Godsey。 有时&#xff0c;检索增强生成 (RAG) 系统无法深入文档集以找到所需的答案。我们可能…

同质化的卷需要支撑多样化的环境来调和

(*^__^*) 代价高昂的免费机器人课程{人工智能与机器人教育之个人感悟}_从事机器人工程专业或机器人方向相关课程开发3年多的时间,从编写控制机器人的第一-CSDN博客 如上这篇写于2016&#xff0c;发表在博客的时间是2018。 总是觉得要补充些什么&#xff0c;但是&#xff0c;…

【模板进阶】std::true_type和std::false_type

一、 s t d : : t r u e _ t y p e std::true\_type std::true_type和 s t d : : f a l s e _ t y p e std::false\_type std::false_type的实现 s t d : : t r u e _ t y p e std::true\_type std::true_type和 s t d : : f a l s e _ t y p e std::false\_type std::false_t…