1. 程式人生 > >【資料結構週週練】020 利用遞迴判斷一棵二叉樹是否為二叉排序樹

【資料結構週週練】020 利用遞迴判斷一棵二叉樹是否為二叉排序樹

一、二叉排序樹

二叉排序樹可以說是資料結構中相當重要的內容之一啦,前兩次給大家講了二叉排序樹的建立、遍歷與查詢。今天給大家分享的是二叉排序樹的應用,判斷一個二叉樹是否為一棵二叉排序樹。

二叉排序樹的特點大家都知道,左子樹根結點值<根結點<右子樹根結點值,並且中序遍歷二叉排序樹時,得到的序列是一個嚴格遞增的序列。所以我們可以以此來判斷二叉樹是否為二叉排序樹。

但是不能直接用二叉排序樹的第一個特點,為什麼呢?

我特別設計了第一個圖片,大家會發現,每一個結點都滿足左子樹根結點值<根結點<右子樹根結點值,但是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";

}

四、實現效果