二叉树相关算法

news2024/11/22 23:02:28

1、二叉树基本操作

二叉树的定义就不在这里多说了,下面这个图就是一个简单的二叉树:

二叉树的三种遍历方式:

前序遍历:头左右,也就是先头后左再右:1245367

    public static void prePrint(BinaryTreeNode root) {
        if (root != null) {
            System.err.print(root.val);
            prePrint(root.left);
            prePrint(root.right);
        }
    }

中序遍历:左头右,也就是先左后头再右:4251637

    public static void midPrint(BinaryTreeNode root) {
        if (root != null) {
            midPrint(root.left);
            System.err.print(root.val);
            midPrint(root.right);
        }
    }

后序遍历:左头右,也就是先左后右再头:4526731

    public static void posPrint(BinaryTreeNode root) {
        if (root != null) {
            posPrint(root.left);
            posPrint(root.right);
            System.err.print(root.val);
        }
    }

测试代码:

class BinaryTreeNode {
    int val;
    BinaryTreeNode left;
    BinaryTreeNode right;


    public BinaryTreeNode(int val) {
        this.val = val;
    }

    public BinaryTreeNode(int val, BinaryTreeNode left, BinaryTreeNode right) {
        this.val = val;
        this.left = left;
        this.right = right;
    }
}
    public static void main(String[] args) {
        BinaryTreeNode one = new BinaryTreeNode(1,
                new BinaryTreeNode(2, new BinaryTreeNode(4, null, null), new BinaryTreeNode(5, null, null)),
                new BinaryTreeNode(3, new BinaryTreeNode(6, null, null), new BinaryTreeNode(7, null, null)));
        prePrint(one);
        System.err.println();
        midPrint(one);
        System.err.println();
        posPrint(one);
    }

那么我们可以看出来,不论是哪种遍历方式,其在处理左右子节点的时候,逻辑都是一样的,都是要递归处理,不同的只是头结点的输出时机,那么可以优化成下面的代码:

    public static void print(BinaryTreeNode root, int type) {
        switch (type) {
            case 1:
                if (root != null) {
                    System.err.print(root.val);
                    print(root.left, 1);
                    print(root.right, 1);
                }
                break;
            case 2:
                if (root != null) {
                    print(root.left, 2);
                    System.err.print(root.val);
                    print(root.right, 2);
                }
                break;
            case 3:
                if (root != null) {
                    print(root.left, 3);
                    print(root.right, 3);
                    System.err.print(root.val);
                }
                break;
        }
    }

2、两棵树是否结构一样

如下面的图中,只有左上角和右上角两棵树的结构是一样的,才算符合条件:

Java实现判断两棵树是否一样:

    public static boolean isSameTree(BinaryTreeNode node1, BinaryTreeNode node2) {
        if (node1 == null ^ node2 == null) {
            return false;
        }
        if (node1 == null && node2 == null) {
            return true;
        }
        return node1.val == node2.val && isSameTree(node1.left, node2.left) && isSameTree(node1.right, node2.right);
    }

    @Test
    public void testSame() {
        BinaryTreeNode one = new BinaryTreeNode(1,
                new BinaryTreeNode(2, new BinaryTreeNode(4, null, null), new BinaryTreeNode(5, null, null)),
                new BinaryTreeNode(3, new BinaryTreeNode(6, null, null), new BinaryTreeNode(7, null, null)));
        BinaryTreeNode two = new BinaryTreeNode(1,
                new BinaryTreeNode(2, new BinaryTreeNode(4, null, null), new BinaryTreeNode(5, null, null)),
                new BinaryTreeNode(3, new BinaryTreeNode(6, null, null), new BinaryTreeNode(7, null, null)));
        System.err.println(isSameTree(one, two));
    }

3、镜面树

镜面树有两种情况:

  1. 两棵树互为镜面:按照红线对折,可以重叠 
  2. 单棵树两边互为镜面:代码实现:
        public static boolean isMirror(BinaryTreeNode node1, BinaryTreeNode node2) {
            if (node1 == null ^ node2 == null) {
                return false;
            }
            if (node1 == null && node2 == null) {
                return true;
            }
            return node1.val == node2.val && isMirror(node1.left, node2.right) && isMirror(node1.right, node2.left);
        }
    
        @Test
        public void testMirror() {
            BinaryTreeNode one = new BinaryTreeNode(1,
                    new BinaryTreeNode(2, new BinaryTreeNode(4, null, null), new BinaryTreeNode(5, null, null)),
                    new BinaryTreeNode(2, new BinaryTreeNode(5, null, null), new BinaryTreeNode(4, null, null)));
            BinaryTreeNode two = new BinaryTreeNode(1,
                    new BinaryTreeNode(2, new BinaryTreeNode(4, null, null), new BinaryTreeNode(5, null, null)),
                    new BinaryTreeNode(2, new BinaryTreeNode(5, null, null), new BinaryTreeNode(4, null, null)));
            System.err.println(isMirror(one, two));
        }

 4、树的最大深度

二叉树的最大深度其实就是左子树和右子树的最大深度加一,代码实现如下:

    public static int maxDepth(BinaryTreeNode root) {
        if (root == null) {
            return 0;
        }
        return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1;
    }

    @Test
    public void testMaxDepth() {
        BinaryTreeNode two = new BinaryTreeNode(1,
                new BinaryTreeNode(2, new BinaryTreeNode(4, null, null), new BinaryTreeNode(5, null, null)),
                new BinaryTreeNode(2, new BinaryTreeNode(5, null, null), new BinaryTreeNode(4, null, null)));
        System.err.println(maxDepth(two));
    }

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

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

相关文章

黑豹程序员-架构师学习路线图-百科:MySQL

文章目录 1、什么是MySQL2、MySQL受喜爱程度经典四人组: 3、发展历史4、MariaDB 1、什么是MySQL MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 …

彻底搞懂:防止表单重复提交,前端限制还是后端限制?

欢迎大家来到小米的技术分享专栏!今天我将为大家带来一个热门话题:如何有效地防止表单重复提交。在开发中,我们常常会遇到这样的问题:用户频繁点击提交按钮,导致数据重复提交,给系统和用户体验带来不必要的…

python项目之统一身份认证协议设计与实现

项目简介 统一身份认证协议设计实现了以下功能: 通过以首页设计、服务管理设计、日志管理设计、用户的信息管理等内容来完成对整个系统的功能模块的设计。 服务管理来完成对统一身份认证的系统整体管理,包括的对托管的注册服务功能管理、对于系统网址的…

第七章 网络安全 | 计算机网络(谢希仁 第八版)

文章目录 第七章 网络安全7.1 网络安全问题概述7.1.1 计算机网络面临的安全性威胁7.1.2 安全的计算机网络7.1.3 数据加密模型 7.2 两类密码体制7.2.1 对称密钥密码体制7.2.2 公钥密码体制 7.3 数字签名7.4 鉴别7.4.1 报文鉴别7.4.2 实体鉴别 7.5 密钥分配7.5.1 对称密钥的分配7…

跟着Datawhale打一场时序比赛(SEED新能源赛道-电动汽车充电站充电需求预测)之打卡笔记一

最近Datawhale又开始组织打比赛的培训学习了,很早就认识了这个专业的学习组织,跟着他们也学过不少竞赛知识,但是还没完全打完过一场赛事;所以这次打算跟着Datawhale打这场时序的比赛 —> 2023“SEED”第四届江苏大数据开发与应…

5.1 加载矢量图层(ogr,gpx)

文章目录 前言加载矢量(vector)图层ogrShapefileQGis导入.shp文件代码导入 gpxQGis导入GPX文件代码导入 gpkgQGis导入GPKG文件代码导入 geojsonQGis导入GeoJson文件代码导入 gmlQGis导入GML代码导入 kml/kmzQGis导入Kml代码导入 dxf/dwgQGis导入dxf代码导入 CoverageQGis导入Co…

2023年全球及中国多肽CDMO市场发展概述分析:CDMO头部企业将拓展至多肽领域[图]

多肽药物是指通过生物合成法或者化学合成法获得的具有特定治疗作用的多肽,多肽药物的分子量介于小分子化药和蛋白质类药物之间,形成了其独特药学空间。多肽药物相比于小分子化药及蛋白质类药物的优势在其发展过程中被逐渐发掘,其在质量控制水…

提升医疗服务质量:将互联网医院源码应用于实践

随着科技的快速发展,医疗行业也亟需寻求创新的解决方案来提升服务质量。在这个数字化时代,互联网医院源码成为了引人注目的选择,为医疗机构和患者之间的沟通和协作提供了前所未有的便利。作为该领域的专家,我将介绍互联网医院源码…

vscode工程屏蔽不使用的文件夹或文件的方法

一. 简介 vscode是一款 微软提供的免费的代码编辑软件。 对于 IMX6ULL-ALPHA开发板而言,NXP官方uboot一定会支持不止 IMX6ULL芯片的代码,也不止支持 一种架构,还支持其他芯片或架构的源码文件。 为了方便阅读代码,vscode软件可…

Java反射调用jar包实现多态

上一篇实现了反射调用jar包,但是没有实现多态,这次先给自己的jar包类抽象一个接口,然后实现类实现接口。最后调用放反射得到的对像转换成接口类型调用执行。 定义接口,指定包为ZLZJar package ZLZJar;public interface ITest {p…

优思学院|改变游戏规则:六西格玛的奇迹力量!

在当今全球竞争激烈的商业环境中,企业家们正在寻找各种方法来提高效率、降低成本并确保顶级质量。在这个追求卓越的道路上,六西格玛以其卓越的数据分析、问题解决和流程优化能力脱颖而出。那么,六西格玛到底是什么,它是如何改变游…

郝培强专访:创业失败、抑郁症和自媒体爆款

近日,我对郝培强(网名:Tinyfool)老师做了一场视频采访(可关注“Micro SaaS开发者公会视频号”观看原视频)。70后的Tinyfool是多年资深的创业者、开发者,研发或者技术服务过六间房、有道词典、大…

每日一题 2652. 倍数求和(简单)

最简单的做法,遍历求和,时间O(n) class Solution:def sumOfMultiples(self, n: int) -> int:return sum([i if (i % 3 0) or (i % 5 0) or (i % 7 0) else 0 for i in range(n 1)])如果只求在 [1,n] 内能被m整除的数之和,那么 ans (…

IP地址,端口,域名校验

需求: validateAddress(address) {const parts address.split(:); //例子:[192.168.0.55, 2022]const host parts[0];const port Number(parts[1]);if (/^[0-9]\.[0-9]\.[0-9]\.[0-9]$/.test(host)) {// 是 IP 地址const octets host.split(.);if (…

3、函数式编程--Optional

目录 4. Optional4.1 概述4.2 使用4.2.1 创建对象OptionalofNullable()of()empty() 4.2.2 安全消费值ifPresent 4.2.3 获取值get() 4.2.4 安全获取值orElseGetorElseThrow 4.2.5 过滤filter 4.2.6 判断isPresent 4.2.7 数据转换map 4. Optional 4.1 概述 ​ 我们在编写代码的…

伯俊ERP和金蝶云星空接口打通对接实战

伯俊ERP和金蝶云星空接口打通对接实战 对接系统伯俊ERP 伯俊科技,依托在企业信息化建设方面的领先技术与实践积累,致力于帮助企业实现全渠道一盘货。伯俊提供数字经营的咨询与系统实施,助力企业信息化升级、加速数字化转型,覆盖零…

信息检索与数据挖掘|(四)索引构建

目录 📚硬件基础 📚基于块的排序索引方法 🐇BSBI算法(blocked sort-based indexing) 📚内存式单遍扫描索引构建方法 🐇SPIMI算法(single-pass in-memory indexing) 📚分布式索引构建方法 &#x1f4d…

Cesium Vue(二)— 基础配置

1. 修改默认配置 设置cesium token // 设置cesium token 官网上申请 Cesium.Ion.defaultAccessToken "token";设置默认视角 //设置默认视角 Cesium.Camera.DEFAULT_VIEW_RECTANGLE Cesium.Rectangle.fromDegrees(// 西边的经度89.5,// 南边维度20.4,// 东边经度1…

手把手 java springboot 整合 JUnit进行单元测试

首先 我们在pom.xml中注入JUnit工具 <dependency><groupId>org.junit.jupiter</groupId><artifactId>junit-jupiter-api</artifactId><version>5.8.1</version><scope>test</scope> </dependency>然后 我们顺便找…

DM工作笔记-DATEADD(指定日期添加n个时间段)函数和其他时间函数

达梦官方文档已经说得很清楚了&#xff0c;在此仅记录下笔记&#xff0c;方便以后进行查阅。 DATEADD对应的相关文档如下&#xff1a; 这里说明下CREATE_TIME是TIMESTAMP类型。 如下例子&#xff1a; select CREATE_TIME from TEST_TABLE 运行截图如下&#xff1a; 现在有个…