数据结构---判断一棵树是否是二叉搜索树
数据结构—判断一棵树是否是二叉搜索树
代码:
#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;elseenQueue(q, temp->lchild); }if (temp&&temp->rchild) {if (temp->rchild->data < temp->data)return 0;elseenQueue(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)
如果存在什么问题,欢迎批评指正!谢谢!
数据结构---判断一棵树是否是二叉搜索树相关推荐
- 判断一棵树是否是二叉搜索树
1.什么是二叉搜索树? 二叉搜索树:如果一棵树为空树,那么是二叉搜索树:如果左子树的所有节点都小于根节点,右子树所有节点都大于根节点,那么是二叉搜索树 2.那么怎么编码呢? 根据BST的定义,我们往往 ...
- 每天一道LeetCode-----判断某棵树是否是二叉搜索树
Validate Binary Search Tree 原题链接Validate Binary Search Tree 判断一颗树是否是二叉搜索树,一棵树是BST需要满足 一个节点的值大于它左子树所有 ...
- 【数据结构与算法】之深入解析“把二叉搜索树转换为累加树”和“从二叉搜索树到更大和树”的求解思路与算法示例
一.题目要求 ① 把二叉搜索树转换为累加树 给出二叉搜索树的根节点,该树的节点值各不相同,请将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 no ...
- 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)
原文:http://blog.csdn.net/sup_heaven/article/details/39313731 数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B ...
- AVL树(平衡二叉搜索树)详解及C++代码实现
AVL树简介 AVL树实际上一个引入了平衡因子的二叉搜索树,该平衡因子保证了每个节点的左右子树高度之差的绝对值不超过1,这样就可以降低树的高度,减少平均搜索长度. 一棵AVL树或者是空树,或者是具有以 ...
- AVL树(平衡二叉搜索树)
AVL树 一.AVL树 1.AVL树的概念 2.AVL树节点的定义(描述) 3.AVL树的插入 4.AVL树的旋转 (1)左单旋 (2)右单旋 (3)左右双旋 (4)右左双旋 (5)插入的整体代码 5 ...
- 数据结构-判断一棵树是否为二叉排序树
判断一棵树是否为二叉排序树 二叉排序树的性质:如果按照中序遍历的方式遍历二叉排序树的话,遍历的数字是呈递增趋势的.我们根据这个思路去判断是否为二叉排序树. 思路: ①建树 ②设立一个变量去记录当前已经 ...
- 【数据结构pta】L3-1-二叉树及其遍历 / 二叉搜索树 / 完全二叉树 是否完全二叉搜索树分数 30
L3-1-二叉树及其遍历 / 二叉搜索树 / 完全二叉树 是否完全二叉搜索树 分数 30 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左 ...
- 判定一棵二叉树是否是二叉搜索树
问题 给定一棵二叉树,判定该二叉树是否是二叉搜索树(Binary Search Tree)? 解法1:暴力搜索 首先说明一下二叉树和二叉搜索树的区别.二叉树指这样的树结构,它的每个结点的孩子数目最多为 ...
最新文章
- 共读计划 | 你有多久没读完一本书了?
- 中国科学家发现恐惧情绪的新环路
- 003_SQL语言简介
- SAP ABAP开发实用快捷键
- android 禁止Viewpager左右滑动功能
- 二叉树的左右子树交换
- 信息设计中的“父子关系”
- 计算机三级之嵌入式系统学习笔记5
- Ubuntu 安装 Clang 编译器
- P2296 寻找道路
- Zbrush 2022 for Mac(数字雕刻和绘画程序)
- 2022年MathorCup建模赛D题:MATLAB代码与若干问题
- 支付宝拿技术开刀把扫码无情地革掉
- 桌面小工具天气连接不到服务器,为什么Windows 7的系统里的天气小工具显示没法连接到服务?...
- DRAM内存物理地址和地址译码器原理的剖析
- 前端cookie 放到请求头_ajax请求头cookie问题
- 教你如何去掉桌面图标的蓝底
- 视频切片mp4格式转换m3u8
- 毕业设计c语言课程设计,毕业设计—c语言—课程设计.doc
- C++面向对象程序设计(侯捷)笔记
热门文章
- Android之Bitmap的内存优化方案总结
- Android之监测database的改变--notifyChange
- 五、Web App 基础可视组件属性(IVX 快速开发教程)
- 速战速决?你不会是不行吧......
- 那些读了硕士博士的人,最不想让你知道的是什么?
- 资料分享 | 数据挖掘实例资料分享来袭
- 兄dei,Python数据竞赛和5万现金奖励了解一下
- 免安装免配置 还免费的Spark 集群 --Databrickes Spark Clould
- 兄弟机cnc系统面板图解_FANUC软操作面板的应用介绍,真的太详细了
- 服务器自动删文件,服务器定时删除文件工具