找到二叉树中符合搜索二叉树条件的最大拓扑结构

2024-06-21 22:32

本文主要是介绍找到二叉树中符合搜索二叉树条件的最大拓扑结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


import java.util.*;
//找到二叉树中符合搜索二叉树条件的最大拓扑结构public class MaxSearchTreeTuo{//二叉树节点的定义public static class Node{public int value;public Node left;public Node right;public Node(int data){this.value=data;}}//获得最大拓扑结构的大小public static int bstTopSize(Node head){if(head==null){return 0;}int max=MaxTopo(head,head);max=Math.max(bstTopSize(head.left),max);max=Math.max(bstTopSize(head.right),max);return max;}//获得节点的最大拓扑子结构public static int MaxTopo(Node h,Node n){if(h!=null&&n!=null&&isBSTNode(h,n,n.value)){return MaxTopo(h,n.left)+MaxTopo(h,n.right)+1;}return 0;}//判断是否为拓扑子结构的节点public static boolean isBSTNode(Node h,Node n,int value){if(h==null){return false;}if(h==n){return true;}return isBSTNode(h.value>value?h.left:h.right,n,value);}//方法二  采用拓扑贡献记录public static class Record {public int l;  //左子树贡献值public int r;   //右子树贡献值public Record(int left, int right) {this.l = left;this.r = right;}}public static int bstTopoSize2(Node head) {Map<Node, Record> map = new HashMap<Node, Record>();return posOrder(head, map);}public static int posOrder(Node h, Map<Node, Record> map) {if (h == null) {return 0;}int ls = posOrder(h.left, map);int rs = posOrder(h.right, map);modifyMap(h.left, h.value, map, true);modifyMap(h.right, h.value, map, false);Record lr = map.get(h.left);Record rr = map.get(h.right);int lbst = lr == null ? 0 : lr.l + lr.r + 1;int rbst = rr == null ? 0 : rr.l + rr.r + 1;map.put(h, new Record(lbst, rbst));return Math.max(lbst + rbst + 1, Math.max(ls, rs));}public static int modifyMap(Node n, int v, Map<Node, Record> m, boolean s) {if (n == null || (!m.containsKey(n))) {return 0;}Record r = m.get(n);if ((s && n.value > v) || ((!s) && n.value < v)) {m.remove(n);return r.l + r.r + 1;} else {int minus = modifyMap(s ? n.right : n.left, v, m, s);if (s) {r.r = r.r - minus;} else {r.l = r.l - minus;}m.put(n, r);return minus;}}public static void main(String []args){//System.out.println("Hello");Node node=new Node(12);node.left=new Node(10);node.right=new Node(13);node.left.left=new Node(4);node.left.right=new Node(14);node.right.left=new Node(20);node.right.right=new Node(16);node.left.left.left=new Node(2);node.left.left.right=new Node(5);node.left.right.left=new Node(11);node.left.right.right=new Node(15);System.out.println(bstTopSize(node));System.out.println(bstTopoSize2(node));}
}


这篇关于找到二叉树中符合搜索二叉树条件的最大拓扑结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1082521

相关文章

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

利用Python开发Markdown表格结构转换为Excel工具

《利用Python开发Markdown表格结构转换为Excel工具》在数据管理和文档编写过程中,我们经常使用Markdown来记录表格数据,但它没有Excel使用方便,所以本文将使用Python编写一... 目录1.完整代码2. 项目概述3. 代码解析3.1 依赖库3.2 GUI 设计3.3 解析 Mark

Python使用DeepSeek进行联网搜索功能详解

《Python使用DeepSeek进行联网搜索功能详解》Python作为一种非常流行的编程语言,结合DeepSeek这一高性能的深度学习工具包,可以方便地处理各种深度学习任务,本文将介绍一下如何使用P... 目录一、环境准备与依赖安装二、DeepSeek简介三、联网搜索与数据集准备四、实践示例:图像分类1.

Nginx中location实现多条件匹配的方法详解

《Nginx中location实现多条件匹配的方法详解》在Nginx中,location指令用于匹配请求的URI,虽然location本身是基于单一匹配规则的,但可以通过多种方式实现多个条件的匹配逻辑... 目录1. 概述2. 实现多条件匹配的方式2.1 使用多个 location 块2.2 使用正则表达式

mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据

《mysql通过frm和ibd文件恢复表_mysql5.7根据.frm和.ibd文件恢复表结构和数据》文章主要介绍了如何从.frm和.ibd文件恢复MySQLInnoDB表结构和数据,需要的朋友可以参... 目录一、恢复表结构二、恢复表数据补充方法一、恢复表结构(从 .frm 文件)方法 1:使用 mysq

Python中顺序结构和循环结构示例代码

《Python中顺序结构和循环结构示例代码》:本文主要介绍Python中的条件语句和循环语句,条件语句用于根据条件执行不同的代码块,循环语句用于重复执行一段代码,文章还详细说明了range函数的使... 目录一、条件语句(1)条件语句的定义(2)条件语句的语法(a)单分支 if(b)双分支 if-else(

使用Navicat工具比对两个数据库所有表结构的差异案例详解

《使用Navicat工具比对两个数据库所有表结构的差异案例详解》:本文主要介绍如何使用Navicat工具对比两个数据库test_old和test_new,并生成相应的DDLSQL语句,以便将te... 目录概要案例一、如图两个数据库test_old和test_new进行比较:二、开始比较总结概要公司存在多

详解如何在React中执行条件渲染

《详解如何在React中执行条件渲染》在现代Web开发中,React作为一种流行的JavaScript库,为开发者提供了一种高效构建用户界面的方式,条件渲染是React中的一个关键概念,本文将深入探讨... 目录引言什么是条件渲染?基础示例使用逻辑与运算符(&&)使用条件语句列表中的条件渲染总结引言在现代

Java中switch-case结构的使用方法举例详解

《Java中switch-case结构的使用方法举例详解》:本文主要介绍Java中switch-case结构使用的相关资料,switch-case结构是Java中处理多个分支条件的一种有效方式,它... 目录前言一、switch-case结构的基本语法二、使用示例三、注意事项四、总结前言对于Java初学者

Oracle Expdp按条件导出指定表数据的方法实例

《OracleExpdp按条件导出指定表数据的方法实例》:本文主要介绍Oracle的expdp数据泵方式导出特定机构和时间范围的数据,并通过parfile文件进行条件限制和配置,文中通过代码介绍... 目录1.场景描述 2.方案分析3.实验验证 3.1 parfile文件3.2 expdp命令导出4.总结