1. 程式人生 > >資料結構:由有序數列建立一棵高度最小的二叉排序樹與判斷一 個序列是否為該二叉排序樹中的一個合法查詢序列

資料結構:由有序數列建立一棵高度最小的二叉排序樹與判斷一 個序列是否為該二叉排序樹中的一個合法查詢序列

編寫一個程式,對於給定的一個有序的關鍵字序列,建立一棵高度最小的二叉排序樹。並判斷一個序列是否為該二叉排序樹中的一個合法的查詢序列

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{
	int data;
	struct node *lchild,*rchild;
} BSTNode;

int *A;    //全域性變數A

BSTNode* CreateBST(int low,int high)  //用關鍵字序列建立高度最小的二叉排序樹,low,high初值為序列中最小數與最大數下標
{                           //這裡的關鍵字序列為int陣列,為節省記憶體使用全域性變數
	int mid = (low+high)/2;
	BSTNode *root;
	if(low<=high)
	{
		root = (BSTNode*)malloc(sizeof(BSTNode));
		root->data=A[mid];
		root->lchild=CreateBST(low,mid-1);
		root->rchild=CreateBST(mid+1,high);
		return root;
	}
	else
		return NULL;
}
BSTNode* SearchBST(BSTNode* bt,int k)   //在二叉排序樹中查詢k
{
	if(bt==NULL || bt->data==k)
		return bt;
	if(k < bt->data)
		return SearchBST(bt->lchild,k);
	else
		return SearchBST(bt->rchild,k);
}


bool SearchSortBST(BSTNode* bt,int *B,int lenth)  //在二叉排序樹中查詢序列,檢測序列是否是合法的查詢序列
{
	bool T;
	int i;
	for(i=0;i<lenth;i++)
		if(SearchBST(bt,B[i])==NULL)  //若序列中有一個數不存在
			return 0;                 //則返回假
	return 1;                         //若序列中數都存在,返回真
}


void BubbleSort (int *A,int lenth)  //氣泡排序
{
	int T,i,j,mid;
	for(i=0;i<lenth-1;i++)     //lenth個數字做lenth-1次迴圈
	{
		for(j=0;j<lenth-i-1;j++)
		{
			T=1;
			if(A[j]>A[j+1])    //大的數放後面,做交換
			{
				T=0;
				mid=A[j];
				A[j]=A[j+1];
				A[j+1]=mid;
			}
		}
		if(T)    //T==1表示數列已為有序序列,無需再進行後面操作
			break;
	}
}
int Input(int *&A)
{
	int count=0;
	printf("請輸入一個整數序列:(輸入-100結束)\n");
	A=(int*)malloc(sizeof(int));
	do                         //動態陣列輸入(記憶體足夠則不受陣列長度影響)
	{
		printf("第%d個整數:",count);
		scanf("%d",&A[count++]);
		A=(int*)realloc(A,(count+1)*sizeof(int));
	}while(A[count-1]!=-100);
	return count-1;            //count即是int序列長+1,也是陣列長,這裡返回count-1,即序列長。
}

void disp(BSTNode *b)
{
	if(b!=NULL)
	{
		printf("%d", b->data);
		if(b->lchild!=NULL||b->rchild!=NULL)
		{
			printf("(");
			disp(b->lchild);
			if (b->rchild != NULL) printf(",");
			disp(b->rchild);
			printf(")");
		}
	}
}


int main ()
{
	int lenthA,lenthB,i,*B;
	BSTNode* bt;
	lenthA=Input(A);          //A為int*全域性變數
	BubbleSort(A,lenthA);     //將輸入的A陣列排序
	bt=CreateBST(0,lenthA-1); //由陣列(int序列)建立二叉排序樹lenth-1為序列中最大數的下標,即序列長-1
	disp(bt);
	printf("\n");printf("請輸入待判斷序列");
	lenthB=Input(B);          //輸入B陣列元素
	if(SearchSortBST(bt,B,lenthB))
		printf("該序列在二叉排序樹中合法!");
	else
		printf("該序列在二叉排序樹中非法!");
}


相關推薦

資料結構有序數列建立高度排序判斷 序列是否排序一個合法查詢序列

編寫一個程式,對於給定的一個有序的關鍵字序列,建立一棵高度最小的二叉排序樹。並判斷一個序列是否為該二叉排序樹中的一個合法的查詢序列 #include<stdio.h> #include<stdlib.h> typedef struct node

面試19之建立高度搜尋

題目描述 對於一個元素各不相同且按升序排列的有序序列,請編寫一個演算法,建立一棵高度最小的二叉查詢樹。給定一個有序序列int[] vals,請返回建立的二叉查詢樹的高度。 注意:這只是求高度最小的二叉查詢樹,不是真的要構建一顆樹,完全二叉樹的高度最小。為log2^n +

C++資料結構)——先序建立

一、二叉樹 (Binary Tree) 定義: 二叉樹是n個節點的有限集合,該集合或者為空集( 稱為空二叉樹 ),或者由一個根節點和兩棵互不相交的的二叉樹組成,這兩棵二叉樹分別稱為根節點的左子樹和右

資料結構的遍歷!按先序遍歷建立,分別以先序、序、後序遍歷輸出

題目:樹的遍歷!按先序遍歷建立一棵樹,分別以先序、中序、後序遍歷輸出 樣例輸入 A B # D # # C E # # F # # 樣例輸出 PreOrder: A B D C E F InOrder: B D A E C F PostOrder: D B E F C A

資料結構求兩有序列表的交集,並集

1.求兩個有序列表的交集 LNode* Intersection(LNode* La,LNode* Lb) { if (La==NULL||Lb==NULL) { return NULL; } LNode *pCHead = NULL; //A與B交集頭 LNode *pCE

Java 連結串列-基礎的動態資料機構連結串列的建立、頭部新增元素、尾部新增元素()筆記

Java 連結串列-最基礎的動態資料機構 優點:真正的動態,不需要處理固定容量的問題 缺點:喪失了隨機訪問的能力 陣列最好用於索引的情況(最大的優點:支援快速查詢) 連結串列不適合用於索引的情況(最大的優點:動態) 新增元素 如果是在頭部新增 那麼直接把元素指向原來頭部,然後

Redis<> 資料結構String

1). set key value : 將字串值 value 關聯到 key 。如果 key 已經持有其他值, SET 就覆寫舊值,無視型別. 2). get key : 返回 key 所關聯的字串值。如果 key 不存在那麼返回特殊值 nil 。 3). MSET key value [key v

C語言實現資料結構.可變陣列

目錄 可變陣列 C語言本身提供的陣列,在定義時就需要指定陣列的長度。然而在一些場景下並不會知道需要用陣列取儲存的資料有多少個,無法明確定義陣列的長度。強行定義一個很大很大的陣列又會浪費機器的記憶體空間。這種情況下就需要一個長度可擴充套件的陣列。

資料結構迴圈佇列()設定一個標誌域後的入佇列和出佇列的演算法

如果希望迴圈佇列中的元素都能得到利用,則需設定一個標誌域tag,並以tag的值為0或1來區分,尾指標和頭指標值相同時的佇列狀態是"空"還是"滿"。試編寫與此結構相應的入佇列和出佇列的演算法。 本題的迴圈佇列CTagQu

資料結構java建立串並實現增刪改查功能

前言:java實現串的過程中遇到的問題 1、當自己建立seqstring物件然後輸出s時,會出現如下結果 public class seqstring {     private char[]strvalue;     private int curlen;     pu

[C++]資料結構大堆MaxHeap的建立使用

優先佇列是一種非常常見的資料結構, 而最大最小樹又是其中最具代表性的一種優先佇列。 在此詳細的講述一下最大樹的插入、刪除、初始化等基本操作的思路。 在文章最後附上一段Demo原始碼提供測試,使用C++語言實現了最大堆。 首先先介紹一下最大樹的概念。 最大樹是每個節點的值都要

資料結構任意長度的有序連結串列歸併排序

難點:不知道何時輸入結束,剛開始想了很長時間,後來想到可以通過if (getchar()=='\n') 是否遇到回車鍵。 有特點

資料結構線段及ST演算法比較

ST演算法是一種高效的計算區間最值的方法。 他的思想是將詢問區間分解成兩個最長的二次冪的長度的區間並集的形式。 所以與線段樹不同,這種區間分解其實存在相交的分解。 因此ST演算法能維護的只是一些簡單的資訊,比如區間最值或者區間gcd問題 ST演算法的優勢: 實現簡單(qwq為什麼我覺得線段樹更

玩轉資料結構——第三章基礎的動態資料結構連結串列

內容概括: 3-1.什麼是連結串列 3-2.在連結串列中新增元素 3-3.使用連結串列的虛擬頭結點 3-4.連結串列的遍歷,查詢和修改 3-5.從連結串列中刪除元素 3-6.使用連結串列實現棧 3-7.帶有尾指標的連結串列:使用連結串列實現佇列

基礎的動態資料結構連結串列

什麼是連結串列 連結串列是一種線性結構,也是最基礎的動態資料結構。我們在實現動態陣列、棧以及佇列時,底層都是依託的靜態陣列,靠resize來解決固定容量的問題,而連結串列是真正的動態資料結構。學習連結串列這種資料結構,能夠更深入的理解引用(或者指標)以及遞迴。其中連結串列分為單鏈連結串列和雙鏈連結串列,本文

資料結構字串(堆)——基本操作

資料結構的重要行不言而喻,簡單介紹我在這部分遇到的一些問題,希望對大家有少許幫助。 首先實現的多個操作: 程式碼: #include<stdio.h> #include<stdlib.h> #include<string.h> #defi

資料結構&堆的概念持續編輯

樹---|---:由 一個根結點 和 N個子結點 及 連線線 構成,任意結點間不構成迴路        |---二叉樹---|---:樹的一種,且任意結點最多隻能有兩個子結點        |     &n

資料結構棧及應用

  棧的定義:      棧是隻能在一端進行資料插入和刪除的線性表。 棧的性質:      後進先出(FILO),後面進去的元素,先出來,先進去的元素後出來 棧的操作:      棧的操作很簡單,就是

資料結構陣列和連結串列的區別以及各自的優缺點

原文地址 http://blog.csdn.net/qq_25806863/article/details/70607204 陣列和連結串列是兩種基本的資料結構,他們在記憶體儲存上的表現不一樣,所以也有各自的特點。 大致總結一下特點和區別,拿幾個人一起去看電影時坐座位為例。 陣列的特點

Python基礎【資料結構列表 | 元組 | 集合 | 字典】

序列 序列是Python中最基本的資料結構。包括字串,列表,元組,Unicode字串,buffer物件,xrange物件。序列中的每個元素都分配一個數字,即它的索引第一個索引是0,第二個索引是1,依此類推。 列表和元組 列表一個方括號內的逗號分隔值列表中可以存放不同的資料型別。