数据结构---判断一棵树是否是二叉搜索树
生活随笔
收集整理的這篇文章主要介紹了
数据结构---判断一棵树是否是二叉搜索树
小編覺得挺不錯的,現(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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全黑麦粉适合减肥吗
- 下一篇: 半个月瘦20斤可能吗