IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 数据结构---判断一棵树是否是二叉搜索树 -> 正文阅读

[数据结构与算法]数据结构---判断一棵树是否是二叉搜索树

数据结构—判断一棵树是否是二叉搜索树

代码:

#pragma once
#define N 100
#define elemType BTree*
#include<stdlib.h>
typedef struct BTree {
	int data;
	struct BTree *lchild, *rchild;
}BTree;
typedef struct dQueue {
	elemType data;
	struct dQueue* next;
}dQueue;
typedef struct queue {
	dQueue *front, *rear;
}queue;
bool initQueue(queue &Queue) {//初始化队列
	//Queue.front = new dQueue;
	Queue.front = Queue.rear = (dQueue*)malloc(sizeof(dQueue));
	if (!Queue.front) {
		return false;
	}
	Queue.front->next = NULL;//头结点
	return true;
}
elemType getQueueTopElem(queue &Queue) {//获取队列队头的元素
	elemType u=NULL ;
	if (Queue.front != Queue.rear) {
		dQueue* p = Queue.front->next;
		u = p->data;
	}
	return u;
}
bool enQueue(queue &Queue, elemType e) {//入队
	dQueue* p = Queue.rear;
	dQueue* s = (dQueue*)malloc(sizeof(dQueue));
	s->data = e;
	s->next = NULL;
	p->next = s;
	Queue.rear = s;
	return true;
}
bool deQueue(queue &Queue, elemType &e) {//出队
	if (Queue.front == Queue.rear) {
		return false;//空队
	}
	dQueue* p = Queue.front->next;
	e = p->data;
	Queue.front->next = p->next;
	if (p == Queue.rear) {//队尾只有一个元素的时候
		Queue.rear = Queue.front;
	}
	delete p;
	return true;
}
bool emptyQueue(queue Queue) {//队列为空的判断
	if (Queue.front == Queue.rear) {
		return true;
	}
	return false;
}
#include <stdio.h>
#include <stdlib.h>
//#include "BTree.h"
#include"queue.h"
int preElem = -1;
void createBSTTree(BTree* & T, int data) {//创建二叉排序树
	BTree *p = NULL;
	if (!T) {
		p = (BTree*)malloc(sizeof(BTree));
		p->data = data;
		p->lchild = p->rchild = NULL;
		T = p;
		return;
	}
	if (data < T->data) {//左子树插入
		createBSTTree(T->lchild, data);
	}
	else {//右子树插入
		createBSTTree(T->rchild, data);
	}
}
int isBST(BTree* bTree) {//必须满足严格的左子树结点的值小于跟结点的值,右节点的值大于根节点的值
	int b1, b2;//中序遍历+递归返回值影响
	if (bTree == NULL) {//小条件退出
		return 1;
	}
	else {
		b1 = isBST(bTree->lchild);
		if (b1 == 0 || preElem >= bTree->data) {
			return 0;
		}
		preElem = bTree->data;
		b2 = isBST(bTree->rchild);
		return b2;
	}
}
int isBST2(BTree* btree) {//非递归
	queue q;
	initQueue(q);
	enQueue(q, btree);
	while (!emptyQueue(q)) {
		BTree* temp;
		deQueue(q, temp);
		if (temp&&temp->lchild) {
			if(temp->lchild->data >= temp->data)
				return 0;
			else
				enQueue(q, temp->lchild);	
		}
		if (temp&&temp->rchild) {
			if (temp->rchild->data < temp->data)
				return 0;
			else
				enQueue(q, temp->rchild);
		}
	}
	return 1;
}
void midTraverseTree(BTree*  BSTTree) {//中序遍历二叉排序树
	if (BSTTree) {
		midTraverseTree(BSTTree->lchild);
		printf("%d ", BSTTree->data);
		midTraverseTree(BSTTree->rchild);
	}
}
int main() {
	BTree* T = NULL;//一定要初始化为空树
	int count, data;
	printf("开始构造二叉排序树:\n输入二叉排序树结点的数目:");
	scanf_s("%d", &count);
	while (count--) {//构造二叉排序树
		printf("输入二叉树的第%d个结点:", count + 1);
		scanf_s("%d", &data);
		createBSTTree(T, data);
	}
	printf("中序遍历二叉树\n");
	midTraverseTree(T);//中序遍历二叉排序树
	printf("\n方法一判断是否是二叉排序树\n");
	if (isBST(T)) {
		printf("\n是二叉排序树\n");
	}
	else {
		printf("\n不是二叉排序树\n");
	}
	printf("\n方法二判断是否是二叉排序树\n");
	if (isBST2(T)) {
		printf("\n是二叉排序树\n");
	}
	else {
		printf("\n不是二叉排序树\n");
	}
	printf("\n");
	system("pause");
	return 0;
}

测试截图:

请添加图片描述

时间复杂度O(n或nlogn),空间复杂度O(1)

如果存在什么问题,欢迎批评指正!谢谢!

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-20 16:00:39  更:2021-09-20 16:00:43 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:48:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码