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

代码:

#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. 判断一棵树是否是二叉搜索树

    1.什么是二叉搜索树? 二叉搜索树:如果一棵树为空树,那么是二叉搜索树:如果左子树的所有节点都小于根节点,右子树所有节点都大于根节点,那么是二叉搜索树 2.那么怎么编码呢? 根据BST的定义,我们往往 ...

  2. 每天一道LeetCode-----判断某棵树是否是二叉搜索树

    Validate Binary Search Tree 原题链接Validate Binary Search Tree 判断一颗树是否是二叉搜索树,一棵树是BST需要满足 一个节点的值大于它左子树所有 ...

  3. 【数据结构与算法】之深入解析“把二叉搜索树转换为累加树”和“从二叉搜索树到更大和树”的求解思路与算法示例

    一.题目要求 ① 把二叉搜索树转换为累加树 给出二叉搜索树的根节点,该树的节点值各不相同,请将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 no ...

  4. 数据结构中常见的树(BST二叉搜索树、AVL平衡二叉树、RBT红黑树、B-树、B+树、B*树)

    原文:http://blog.csdn.net/sup_heaven/article/details/39313731 数据结构中常见的树(BST二叉搜索树.AVL平衡二叉树.RBT红黑树.B-树.B ...

  5. AVL树(平衡二叉搜索树)详解及C++代码实现

    AVL树简介 AVL树实际上一个引入了平衡因子的二叉搜索树,该平衡因子保证了每个节点的左右子树高度之差的绝对值不超过1,这样就可以降低树的高度,减少平均搜索长度. 一棵AVL树或者是空树,或者是具有以 ...

  6. AVL树(平衡二叉搜索树)

    AVL树 一.AVL树 1.AVL树的概念 2.AVL树节点的定义(描述) 3.AVL树的插入 4.AVL树的旋转 (1)左单旋 (2)右单旋 (3)左右双旋 (4)右左双旋 (5)插入的整体代码 5 ...

  7. 数据结构-判断一棵树是否为二叉排序树

    判断一棵树是否为二叉排序树 二叉排序树的性质:如果按照中序遍历的方式遍历二叉排序树的话,遍历的数字是呈递增趋势的.我们根据这个思路去判断是否为二叉排序树. 思路: ①建树 ②设立一个变量去记录当前已经 ...

  8. 【数据结构pta】L3-1-二叉树及其遍历 / 二叉搜索树 / 完全二叉树 是否完全二叉搜索树分数 30

    L3-1-二叉树及其遍历 / 二叉搜索树 / 完全二叉树 是否完全二叉搜索树 分数 30 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左 ...

  9. 判定一棵二叉树是否是二叉搜索树

    问题 给定一棵二叉树,判定该二叉树是否是二叉搜索树(Binary Search Tree)? 解法1:暴力搜索 首先说明一下二叉树和二叉搜索树的区别.二叉树指这样的树结构,它的每个结点的孩子数目最多为 ...

最新文章

  1. 共读计划 | 你有多久没读完一本书了?
  2. 中国科学家发现恐惧情绪的新环路
  3. 003_SQL语言简介
  4. SAP ABAP开发实用快捷键
  5. android 禁止Viewpager左右滑动功能
  6. 二叉树的左右子树交换
  7. 信息设计中的“父子关系”
  8. 计算机三级之嵌入式系统学习笔记5
  9. Ubuntu 安装 Clang 编译器
  10. P2296 寻找道路
  11. Zbrush 2022 for Mac(数字雕刻和绘画程序)
  12. 2022年MathorCup建模赛D题:MATLAB代码与若干问题
  13. 支付宝拿技术开刀把扫码无情地革掉
  14. 桌面小工具天气连接不到服务器,为什么Windows 7的系统里的天气小工具显示没法连接到服务?...
  15. DRAM内存物理地址和地址译码器原理的剖析
  16. 前端cookie 放到请求头_ajax请求头cookie问题
  17. 教你如何去掉桌面图标的蓝底
  18. 视频切片mp4格式转换m3u8
  19. 毕业设计c语言课程设计,毕业设计—c语言—课程设计.doc
  20. C++面向对象程序设计(侯捷)笔记

热门文章

  1. Android之Bitmap的内存优化方案总结
  2. Android之监测database的改变--notifyChange
  3. 五、Web App 基础可视组件属性(IVX 快速开发教程)
  4. 速战速决?你不会是不行吧......
  5. 那些读了硕士博士的人,最不想让你知道的是什么?
  6. 资料分享 | 数据挖掘实例资料分享来袭
  7. 兄dei,Python数据竞赛和5万现金奖励了解一下
  8. 免安装免配置 还免费的Spark 集群 --Databrickes Spark Clould
  9. 兄弟机cnc系统面板图解_FANUC软操作面板的应用介绍,真的太详细了
  10. 服务器自动删文件,服务器定时删除文件工具