日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2023/12/4 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据结构---判断一棵树是否是二叉搜索树 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

數(shù)據(jù)結(jié)構(gòu)—判斷一棵樹是否是二叉搜索樹

代碼:

#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) {//初始化隊(duì)列//Queue.front = new dQueue;Queue.front = Queue.rear = (dQueue*)malloc(sizeof(dQueue));if (!Queue.front) {return false;}Queue.front->next = NULL;//頭結(jié)點(diǎn)return true; } elemType getQueueTopElem(queue &Queue) {//獲取隊(duì)列隊(duì)頭的元素elemType u=NULL ;if (Queue.front != Queue.rear) {dQueue* p = Queue.front->next;u = p->data;}return u; } bool enQueue(queue &Queue, elemType e) {//入隊(duì)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) {//出隊(duì)if (Queue.front == Queue.rear) {return false;//空隊(duì)}dQueue* p = Queue.front->next;e = p->data;Queue.front->next = p->next;if (p == Queue.rear) {//隊(duì)尾只有一個元素的時候Queue.rear = Queue.front;}delete p;return true; } bool emptyQueue(queue Queue) {//隊(duì)列為空的判斷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) {//創(chuàng)建二叉排序樹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) {//必須滿足嚴(yán)格的左子樹結(jié)點(diǎn)的值小于跟結(jié)點(diǎn)的值,右節(jié)點(diǎn)的值大于根節(jié)點(diǎn)的值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("開始構(gòu)造二叉排序樹:\n輸入二叉排序樹結(jié)點(diǎn)的數(shù)目:");scanf_s("%d", &count);while (count--) {//構(gòu)造二叉排序樹printf("輸入二叉樹的第%d個結(jié)點(diǎn):", 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; }

測試截圖:

時間復(fù)雜度O(n或nlogn),空間復(fù)雜度O(1)

如果存在什么問題,歡迎批評指正!謝謝!

總結(jié)

以上是生活随笔為你收集整理的数据结构---判断一棵树是否是二叉搜索树的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。