搜索二叉树迭代和递归的两种*简单*实现方式

news2024/10/6 2:25:25

判断搜索二叉树

概念

一棵树所有结点的左节点小于父节点,右节点大于父节点,则为搜索二叉树。
搜索二叉树

迭代方法

  • 中序遍历二叉树,如果总是升序是搜索二叉树
  • 如果存在降序,那肯定不是搜索二叉树

Coding

checkTreeOrder()方法

bool checkTreeOrder(Node* head) {
	stack<Node*> st;
	int n = INT_MIN;
	while (!st.empty() || head != NULL) {
		if (head != NULL) {
			st.push(head);
			head = head->left;
		} else {
			Node* node = st.top();
			if (node->value > n) {
				n = node->value;
			} else {
				return false;
			}
			st.pop();
			head = node->right;
		}
	}
	return true;
}

最终代码

//迭代方法
#include <iostream>
#include <stack>
#include <vector>
using namespace std;
// 判断搜索二叉树

struct Node {
	int value;
	Node* left;
	Node* right;
	Node(int v): value(v), left(NULL), right(NULL) {};
};

bool checkTreeOrder(Node* head) {
	stack<Node*> st;
	int n = INT_MIN;
	while (!st.empty() || head != NULL) {
		if (head != NULL) {
			st.push(head);
			head = head->left;
		} else {
			Node* node = st.top();
			if (node->value > n) {
				n = node->value;
			} else {
				return false;
			}
			st.pop();
			head = node->right;
		}
	}
	return true;
}

int main() {
	Node* head = new Node(5);
	Node* v3 = new Node(3);
	Node* v7 = new Node(7);
	Node* v2 = new Node(2);
	Node* v4 = new Node(4);
	Node* v6 = new Node(6);
	Node* v8 = new Node(8);
	Node* v1 = new Node(1);
	head->left = v3;
	head->right = v7;
	head->left->left = v2;
	head->left->right = v4;
	head->left->left->left = v1;
	head->right->left = v6;
	head->right->right = v8;

	if (checkTreeOrder(head)) {
		cout << "true!" << endl;
	} else {
		cout << "false!" << endl;
	}
}

递归方法

1.第一种实现方式(动态调整)

//递归方法
int preValue = INT_MIN;
inline bool isBST(Node* head) {
	if (head == NULL) {
		return true;
	}
	//如果左树不是,直接剪枝
	bool isLeftBST = isBST(head->left);
	if (isLeftBST == false) {
		return false;
	}
	//**********************

	//设置布尔属性
	if (head->value <= preValue) {
		return false;
	} else {
		preValue = head->value;
	}
	return isBST(head->right);
}

2.第二种实现方式-存入数组依次遍历(更加简单,不过效率略低)

vector<int> BSTelements;
inline void isBST_easy(Node* head) {
	if (head == NULL) return;
	isBST_easy(head->left);
	BSTelements.push_back(head->value);
	isBST_easy(head->right);
}

inline bool checkArrayOrder(Node* head) {
	isBST_easy(head);
	for (int i = 1; i < BSTelements.size(); i++) {
		if (BSTelements[i] < BSTelements[i-1]) {
			return false;
		}
	}
	return true;
}

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

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

相关文章

【Godot4自学手册】第二十六节用GPUParticles2D节点实现地宫入口的奇异光芒

我们的主人公与NPC对话完成后&#xff0c;夜晚来临&#xff0c;在城北有一处乱石岗&#xff0c;出现了奇异光芒&#xff0c;这是地宫的入口&#xff0c;但是有一妖怪把守&#xff0c;我们必须消灭妖怪后才可发现地宫入口。这一节&#xff0c;主要记录利用粒子系统GPUParticles2…

YOLOv9目标识别——环境配置与训练自己的数据集

前言 YOLOv9引入了一种全新的计算机视觉模型架构&#xff0c;相比目前流行的YOLO模型&#xff08;如YOLOv8、YOLOv7和YOLOv5&#xff09;&#xff0c;在MS COCO数据集上取得了更高的mAP&#xff08;平均精度均值&#xff09;。 YOLOv9是由Chien-Yao Wang、I-Hau Yeh和Hong-Yua…

Elasticsearch:调整近似 kNN 搜索

在我之前的文章 “Elasticsearch&#xff1a;调整搜索速度”&#xff0c;我详细地描述了如何调整正常的 BM25 的搜索速度。在今天的文章里&#xff0c;我们来进一步探讨如何提高近似 kNN 的搜索速度。希望对广大的向量搜索开发者有一些启示。 Elasticsearch 支持近似 k 最近邻…

做好外贸网站SEO优化,拓展海外市场

随着全球贸易的发展和互联网的普及&#xff0c;越来越多的外贸企业将目光投向了网络&#xff0c;希望通过建立网站来拓展海外市场。然而&#xff0c;在竞争激烈的外贸市场中&#xff0c;要让自己的网站脱颖而出&#xff0c;吸引更多的目标客户&#xff0c;就需要进行有效的SEO优…

【C语言进阶篇】C语言内存函数

目录 1.memcpy函数及其模拟实现 1.1 memcpy函数的使用 1.2 memcpy函数的模拟实现 2.memmove函数及其模拟实现 2.1 memmove函数的使用 2.2 memmove函数的模拟实现 3.memset函数 4.memcmp函数 1.memcpy函数及其模拟实现 1.1 memcpy函数的使用 memcpy函数是用来拷贝内存的函数&…

【力扣精选算法100道】——带你了解(数组模拟栈)算法

目录 &#x1f4bb;比较含退格的字符串 &#x1f388;了解题意 &#x1f388;分析题意 &#x1f6a9;栈 &#x1f6a9;数组模拟栈 &#x1f388;实现代码 844. 比较含退格的字符串 - 力扣&#xff08;LeetCode&#xff09; &#x1f4bb;比较含退格的字符串 &#x1f3…

代码学习记录22--回溯算法第三天

随想录日记part22 t i m e &#xff1a; time&#xff1a; time&#xff1a; 2024.03.17 主要内容&#xff1a;今天主要是结合类型的题目加深对回溯算法的理解&#xff1a;1.组合总和;2.组合总和 ;3.分割回文串。 39. 组合总和 40.组合总和II131.分割回文串 Topic1组合总和 题…

Error response from daemon Get server gave HTTP response to HTTPS client

使用docker compose拉起docker镜像时&#xff0c;若出现如下报错 Error response from daemon: Get "https://devops.test.cn:5000/v2/": http: server gave HTTP response to HTTPS client表示Docker守护进程无法从指定url获取响应&#xff0c; 可能原因有以下&…

深入理解jsp技术

目录&#xff1a; JSPJSP介绍JSP运行原理JSP标签的使用JSP原始标签的使用JSP的指令标签JSP的内置对象请求转发请求转发案例JSP中的四大作用域对象JSTL标签库EL表达式JSTL标签库与EL表达式的使用 JSP JSP介绍 JSP(全称Java Server Pages)Java服务端页面技术&#xff0c;是JavaEE…

结构体中的内存对齐是什么?一起搞懂它

c语言中的小小白-CSDN博客c语言中的小小白关注算法,c,c语言,贪心算法,链表,mysql,动态规划,后端,线性回归,数据结构,排序算法领域.https://blog.csdn.net/bhbcdxb123?spm1001.2014.3001.5343 给大家分享一句我很喜欢我话&#xff1a; 知不足而奋进&#xff0c;望远山而前行&am…

LeetCode刷题记录:(11)组合(初识回溯算法)

leetcode传送通道 暂时记录&#xff0c;这篇没啥营养&#xff0c;不用看了 class Solution {List<List<Integer>> result new ArrayList<>(); // 存所有组合List<Integer> path new LinkedList<>(); //存每一个组合public List<List<Int…

聚信产服:引领多元化产业服务迈向新纪元

聚信产服成立于2014年&#xff0c;一家在产业服务领域拥有深厚积淀的综合性服务机构&#xff0c;专注于政府招商、园区运营、企业选址咨询及产业链服务等多元化业务。我们致力于通过高效、专业的服务&#xff0c;为政府、企业及投资者提供全方位的产业支持&#xff0c;推动区域…

【鸿蒙HarmonyOS开发笔记】动画过渡效果之布局更新动画

概述 动画的原理是在一个时间段内&#xff0c;多次改变UI外观&#xff0c;由于人眼会产生视觉暂留&#xff0c;所以最终看到的就是一个“连续”的动画。UI的一次改变称为一个动画帧&#xff0c;对应一次屏幕刷新&#xff0c;而决定动画流畅度的一个重要指标就是帧率FPS&#x…

计算机二级(Python)真题讲解每日一题:《十字叉》

描述‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬ ‪‬‪‬‪‬‪‬‪‬‮‬‪…

React Hooks全部总结

Hooks 概念理解 学习目标&#xff1a; 理解 Hooks 的概念及解决的问题 什么是 hooks hooks 的本质&#xff1a; 一套能够使函数组件更强大、更灵活的&#xff08;钩子&#xff09; React 体系里组件分为类组件和函数组件 多年使用发现&#xff0c;函数组件是一个更加匹配 Rea…

解决:visio导出公式为pdf图片乱码问题

今天需要将Visio编辑好的以后的图输出pdf&#xff0c;但是点击保存后公式部分一直乱码&#xff0c;如下图所示 保存为pdf后会变成&#xff1a; 解决方案&#xff1a;保存时点击文件下方的快速打印&#xff0c;存到桌面&#xff0c;不要直接点击保存

Vue3学习日记 Day1

一、简介 1、简介 Vue3是新的默认版本&#xff0c;拥有更快的速度&#xff0c;更好的语法 二、使用create-vue搭建Vue3项目 1、创建项目 1、介绍 create-vue是Vue官方新的脚手架工具&#xff0c;底层切换为了vite&#xff0c;为开发提供极速响应 2、使用 2.1、确定环境条件 2…

关于 闰年 的小知识,为什么这样判断闰年

闰年的规定&#xff1a; 知道了由来&#xff0c;我们就可以写程序来判断&#xff1a; #include <stdio.h> int main() {int year, leap;scanf("%d",&year);if((year%4 0 && year%100 ! 0) || year%400 0)leap 1;else leap 0;if(leap) printf(…

Python大数据实践:selenium爬取京东评论数据

准备工作 selenium安装 Selenium是广泛使用的模拟浏览器运行的库&#xff0c;用于Web应用程序测试。 Selenium测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样&#xff0c;并且支持大多数现代 Web 浏览器。 #终端pip安装 pip install selenium #清华镜像安装 p…

创新应用2:nnmf+DBO+K-Medoids聚类,蜣螂优化算法DBO优化K-Medoids,适合学习和发paper。

创新应用2&#xff1a;nnmfDBOK-Medoids聚类&#xff0c;蜣螂优化算法DBO优化K-Medoids&#xff0c;适合学习和发paper。 一、蜣螂优化算法 摘要&#xff1a;受蜣螂滚球、跳舞、觅食、偷窃和繁殖等行为的启发&#xff0c;提出了一种新的基于种群的优化算法(Dung Beetle Optim…