博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数据结构周周练】035 利用递归判断一棵二叉树是否为二叉排序树
阅读量:4076 次
发布时间:2019-05-25

本文共 2043 字,大约阅读时间需要 6 分钟。

一、二叉排序树

二叉排序树可以说是数据结构中相当重要的内容之一啦,前两次给大家讲了二叉排序树的创建、遍历与查找。今天给大家分享的是二叉排序树的应用,判断一个二叉树是否为一棵二叉排序树。

二叉排序树的特点大家都知道,左子树根结点值<根结点<右子树根结点值,并且中序遍历二叉排序树时,得到的序列是一个严格递增的序列。所以我们可以以此来判断二叉树是否为二叉排序树。

但是不能直接用二叉排序树的第一个特点,为什么呢?

我特别设计了第一个图片,大家会发现,每一个结点都满足左子树根结点值<根结点<右子树根结点值,但是77 > 67。所以不能单从一个结点来判断,我们要把这个原理改一下,左子树结点最大值<根结点<右子树结点最小值。这种方法更适合用来创建二叉排序树,不适合判断是否为二叉排序树,但是第二个特点非常适合用于判断。我们只需要设置一个比所有结点值最小值还小的一个值,与结点从小到大做判断即可,如果最小值比判断的值大,则说明不是二叉排序树,如果最小值比判断的值小,则接着往下做判断,直到树的最后一个结点。如果是二叉排序树,则最小值应该是最左侧的值,只要比这个值小,例如取最小值减一即可。

二、示例

利用算法判断下面的两个二叉树是否为二叉排序树。其中圆角矩形内为结点数据,旁边数字为结点编号,箭头指向的结点为箭尾的孩子结点。

不是二叉排序树
是二叉排序树

 三、代码

#include
#include
using namespace std;typedef struct BiTNode { int data; int number; struct BiTNode *parent,* lChild, * rChild; }BiTNode,*BiTree;int number = 0;int yor = 0;int maxData;int isBST = 1;int yesOrNo[] = { 1,0,1,0,0,1,1,1,0,0,1,0,0,1,0,0 };//int numData[] = { 12,5,11,67,55,45,57,72 };int numData[] = { 12,10,11,67,55,51,77,82 };BiTree treeParent = NULL;int OperationBiTree(BiTree &BT) { BT = (BiTree)malloc(sizeof(BiTNode)); if (!BT) { cout << "空间分配失败" << endl; exit(OVERFLOW); } BT->number = number; number++; BT->data = numData[BT->number]; BT->lChild = NULL; BT->rChild = NULL; BT->parent = treeParent; return 1;}void PreOrderCreatBiTree(BiTree &BT) { OperationBiTree(BT); treeParent = BT; if (yesOrNo[yor++]) PreOrderCreatBiTree(BT->lChild); treeParent = BT; if (yesOrNo[yor++]) PreOrderCreatBiTree(BT->rChild);}void VisitBiTree(BiTree BT) { cout << "当前结点的编号为:" << BT->number<<", 数据为:" << BT->data << ",\n"; }void InOrderBiTree(BiTree BT) { if (BT) { InOrderBiTree(BT->lChild); VisitBiTree(BT); if (maxData < BT->data) { maxData = BT->data; } else isBST = 0; InOrderBiTree(BT->rChild); }}void main() { BiTree BT; PreOrderCreatBiTree(BT); BiTree p = BT; while (p&&p->lChild) { p = p->lChild; } maxData = p->data - 1; cout << "\n******【中序遍历二叉树】******\n"; InOrderBiTree(BT); if (isBST) cout << "This Binary tree is a binary sort tree.\n"; else cout << "This Binary tree isn't a binary sort tree.\n";}

四、实现效果

 

转载地址:http://adyni.baihongyu.com/

你可能感兴趣的文章
java io 下载文件 字节流io典型应用
查看>>
for 与 foreach区别
查看>>
深入理解Java中的IO
查看>>
轻松掌握java读写锁(ReentrantReadWriteLock)的实现原理
查看>>
notify 和 notifyAll 的区别
查看>>
Spring中初始化bean和销毁bean的时候执行某个方法的详解
查看>>
浅谈 Mybatis中的 ${ } 和 #{ }的区别
查看>>
MyBatis结果集处理,中resultType和resultMap的区别
查看>>
【框架】[MyBatis]DAO层只写接口,不用写实现类
查看>>
Java并发编程:volatile关键字解析[volatile最好的文章]
查看>>
Next-key locking是如何解决幻读(当前读)问题的
查看>>
MySQL 加锁处理分析
查看>>
read-uncommited 下脏读的实现
查看>>
rc级别 避免脏读的实现(LBCC & MVCC)
查看>>
三次请求(读-改-读)引出nibernate 一级缓存
查看>>
hibernate 一级缓存实践
查看>>
springboot 获取hibernate 的 SessionFactory
查看>>
会话和事务的区别
查看>>
left join 要点
查看>>
索引基本功 聚簇索引与非聚簇索引区别,各种索引的区别
查看>>