当前位置: 首页 > article >正文

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

判断搜索二叉树

概念

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

迭代方法

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

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.kler.cn/a/273153.html

相关文章:

  • 使用正则表达式验证积累
  • SpringBoot新闻稿件管理系统:架构与实现
  • 拯救者y7000p 打开XMP
  • AI大模型重塑软件开发:从代码自动生成到智能测试
  • GBase与梧桐数据库数据加载与导出的差异
  • iOS中OC对象的本质
  • python--剑指offer--题目目录-学习计划
  • Spring Bean的生命周期流程
  • ElasticSearch架构设计
  • 中国移动端第三方输入法市场专题2024
  • 掘根宝典之C++迭代器简介
  • C/C++中{}的用法总结(全)
  • 后端工程师快速使用vue和Element
  • 从历年315曝光案例,看APP隐私合规安全
  • FPGA——DDR3的IP核
  • Leetcode 3080. Mark Elements on Array by Performing Queries
  • 【SpringCloud】使用Seata实现分布式事务
  • 有关于Docker(容器),Image(镜像)部署等名词含义
  • 恒创科技:什么是BGP线路服务器?BGP机房的优点是什么?
  • vue中判断是否使用自定义插槽
  • 视频私有云,HDMI/AV多硬件设备终端接入,SFU/MCU视频会议交互方案。
  • 【NTN 卫星通信】 TN和多NTN配合的应用场景
  • Android FrameWork 学习路线
  • 行尾检测论文汇总
  • 挖到宝了!这些内容管理平台是企业的最佳选择
  • Kotlin进阶之协程从上车到起飞