判断给定的数组是否为二叉搜索树的后序遍历序列

2024-06-22 14:18

本文主要是介绍判断给定的数组是否为二叉搜索树的后序遍历序列,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题意描述:输入一个整数数组,判断该数组是不是某个二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。例如输入{5,7,6,9,11,10,8}返回true;输入{7,4,6,5}返回false

对应的后序遍历结果为5、7、6、9、11、10、8

解题思路:在后序遍历序列中,最后一个数字是树的根结点的值,前面的数字可分为两个部分:第一部分是左子树,值都比根值小;第二部分是右子树,值都比根大。按些规律,依次判断,如果数组处理完毕则是后序遍历序列,否则不为后序遍历序列

(Java版)

boolean VerifySequenceOfBST(int[] sequence, int start, int end) {		if(sequence == null || (end-start)<=0)return true;int root = sequence[end-1];int i = start;for(; i < end-1; i++)if(sequence[i] > root)break;int j = i;for(; j < end-1; j++)if(sequence[j] < root)return false;//判断左、右子序列是不是满足二叉搜索树boolean left = true;if(i > start)left = VerifySequenceOfBST(sequence, start, i);boolean right = true;if(i < end - 1)right = VerifySequenceOfBST(sequence, i ,end-1-i);return (left && right);		
}

(C++版)

bool VerifySequenceOfBST(int sequence[], int length) {if (sequence == NULL || length <= 0)return false;int root = sequence[length - 1];//在二叉搜索树中左子树的结点值小于根结点值int i = 0;for (; i < length - 1; i++) {if (sequence[i] > root)break;}		//在二叉搜索树右子树的结点值大于根结点值int j = i;for (; j < length - 1; j++) {if (sequence[j] < root)return false;}//判断左子树是不是二叉搜索树bool left = true;if (i > 0)left = VerifySequenceOfBST(sequence, i);//判断右子树是不是二叉搜索树bool right = true;if (i < length - 1)right = VerifySequenceOfBST(sequence + i, length - i - 1);return (left && right);
}

 (Golang版)

func isBinaryTreePostOrder(arr []int) bool {if len(arr) == 0 || len(arr) == 1 {return true}lastEle := arr[len(arr)-1]posIdx := 0for ; posIdx < len(arr); posIdx++ {if arr[posIdx] > lastEle {break}}i := posIdxfor ; i < len(arr); i++ {if arr[i] < lastEle {return false}}left := isBinaryTreePostOrder(arr[0:posIdx])right := isBinaryTreePostOrder(arr[posIdx:len(arr)-1])return left && right
}

 

 

 

 

这篇关于判断给定的数组是否为二叉搜索树的后序遍历序列的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法

《JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法》:本文主要介绍JavaScript中比较两个数组是否有相同元素(交集)的三种常用方法,每种方法结合实例代码给大家介绍的非常... 目录引言:为什么"相等"判断如此重要?方法1:使用some()+includes()(适合小数组)方法2

如何通过try-catch判断数据库唯一键字段是否重复

《如何通过try-catch判断数据库唯一键字段是否重复》在MyBatis+MySQL中,通过try-catch捕获唯一约束异常可避免重复数据查询,优点是减少数据库交互、提升并发安全,缺点是异常处理开... 目录1、原理2、怎么理解“异常走的是数据库错误路径,开销比普通逻辑分支稍高”?1. 普通逻辑分支 v

C# LiteDB处理时间序列数据的高性能解决方案

《C#LiteDB处理时间序列数据的高性能解决方案》LiteDB作为.NET生态下的轻量级嵌入式NoSQL数据库,一直是时间序列处理的优选方案,本文将为大家大家简单介绍一下LiteDB处理时间序列数... 目录为什么选择LiteDB处理时间序列数据第一章:LiteDB时间序列数据模型设计1.1 核心设计原则

从基础到进阶详解Python条件判断的实用指南

《从基础到进阶详解Python条件判断的实用指南》本文将通过15个实战案例,带你大家掌握条件判断的核心技巧,并从基础语法到高级应用一网打尽,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录​引言:条件判断为何如此重要一、基础语法:三行代码构建决策系统二、多条件分支:elif的魔法三、

Linux实现查看某一端口是否开放

《Linux实现查看某一端口是否开放》文章介绍了三种检查端口6379是否开放的方法:通过lsof查看进程占用,用netstat区分TCP/UDP监听状态,以及用telnet测试远程连接可达性... 目录1、使用lsof 命令来查看端口是否开放2、使用netstat 命令来查看端口是否开放3、使用telnet

Java中数组与栈和堆之间的关系说明

《Java中数组与栈和堆之间的关系说明》文章讲解了Java数组的初始化方式、内存存储机制、引用传递特性及遍历、排序、拷贝技巧,强调引用数据类型方法调用时形参可能修改实参,但需注意引用指向单一对象的特性... 目录Java中数组与栈和堆的关系遍历数组接下来是一些编程小技巧总结Java中数组与栈和堆的关系关于

Linux中的自定义协议+序列反序列化用法

《Linux中的自定义协议+序列反序列化用法》文章探讨网络程序在应用层的实现,涉及TCP协议的数据传输机制、结构化数据的序列化与反序列化方法,以及通过JSON和自定义协议构建网络计算器的思路,强调分层... 目录一,再次理解协议二,序列化和反序列化三,实现网络计算器3.1 日志文件3.2Socket.hpp

Spring的RedisTemplate的json反序列泛型丢失问题解决

《Spring的RedisTemplate的json反序列泛型丢失问题解决》本文主要介绍了SpringRedisTemplate中使用JSON序列化时泛型信息丢失的问题及其提出三种解决方案,可以根据性... 目录背景解决方案方案一方案二方案三总结背景在使用RedisTemplate操作redis时我们针对

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优