【資料結構週週練】020 利用遞迴判斷一棵二叉樹是否為二叉排序樹
阿新 • • 發佈:2018-12-18
一、二叉排序樹
二叉排序樹可以說是資料結構中相當重要的內容之一啦,前兩次給大家講了二叉排序樹的建立、遍歷與查詢。今天給大家分享的是二叉排序樹的應用,判斷一個二叉樹是否為一棵二叉排序樹。
二叉排序樹的特點大家都知道,左子樹根結點值<根結點<右子樹根結點值,並且中序遍歷二叉排序樹時,得到的序列是一個嚴格遞增的序列。所以我們可以以此來判斷二叉樹是否為二叉排序樹。
但是不能直接用二叉排序樹的第一個特點,為什麼呢?
我特別設計了第一個圖片,大家會發現,每一個結點都滿足左子樹根結點值<根結點<右子樹根結點值,但是77 > 67。所以不能單從一個結點來判斷,我們要把這個原理改一下,左子樹結點最大值<根結點<右子樹結點最小值
二、示例
利用演算法判斷下面的兩個二叉樹是否為二叉排序樹。其中圓角矩形內為結點資料,旁邊數字為結點編號,箭頭指向的結點為箭尾的孩子結點。
三、程式碼
#include<iostream> #include<malloc.h> 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"; }