1. 程式人生 > >二叉排序樹的建立和刪除

二叉排序樹的建立和刪除

實驗目的

1.  掌握各種查詢方法的基本思想、特點及所適應的不同場合。

2.  熟練掌握順序查詢、折半查詢、索引查詢、二叉排序樹查詢和雜湊表查詢演算法及其實現。

3.  能用所學的查詢方法解決實際問題。

實驗預習

   在實驗預習報告上設計,編寫實驗內容的源程式,給程式加上適當的註釋,設計執行程式所需的測試資料。

實驗內容

1.  設計並驗證如下演算法:二叉樹採用二叉連結串列結構表示,按輸入的關鍵字序列建立一棵二叉排序樹,並刪除該二叉排序樹上的某個節點。

實驗程式碼

#include<iostream>
#include <cstdio>
#include <malloc.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int ElemType;
typedef int KeyType;
typedef int Status;
using namespace std;

typedef struct BiNode{
	ElemType data;
	KeyType key; 
	struct BiNode * lchild;
	struct BiNode * rchild;
}BiNode,*BiTree; 

Status serachBST(BiTree T,KeyType key,BiTree f,BiTree &p){
	if(!T){
		p=f;
		return FALSE;
	}else{
		if(T->key > key){
			serachBST(T->lchild,key,T,p);
		}else if(T->key < key){
			serachBST(T->rchild,key,T,p);
		}else{
			p=T;
			return TRUE;
		}
	}
}
Status insertBST(BiTree &T,BiNode b){
	BiTree p,s; 
	if(!serachBST(T,b.key,NULL,p)){
		s=(BiTree)malloc(sizeof(BiNode));
		s->data=b.data,s->key=b.key,
		s->lchild=NULL,s->rchild=NULL;
		
		if(!p) T=s;
		else if(b.key < p->key){
			p->lchild=s;
		}else{
			p->rchild=s;
		}
		
		return TRUE;
	}else{
		return FALSE;
	}
}

void createBST(BiTree &bst){
	KeyType key;
	bst=NULL;
	BiNode b; 
	scanf("%d %d",&b.key,&b.data);
	while(b.key!=0){
		insertBST(bst,b);
		scanf("%d %d",&b.key,&b.data);
	}
}

void inOrder(BiTree T){
	if(T){
		inOrder(T->lchild);
		printf("%d ",T->key);
		inOrder(T->rchild);
	}
}

Status Delete(BiTree &p){
	BiTree s,q;
	if(!p->rchild){
		q=p;p=p->lchild;free(q);
	}else{
		if(!p->lchild){
			q=p,p=p->rchild;free(q);
		}else{
			q=p;
			s=p->lchild;
			while(s->rchild){
				q=s;
				s=s->rchild;
			}
			p->data=s->data;
			p->key=s->key; 
			if(q!=p)
				q->rchild=s->lchild;
			else q->lchild=s->lchild;
			 free(s);
		}
		return TRUE;
	}
}

Status DeleteBST(BiTree &T,KeyType key){ 
	if(!T)
		return FALSE;
	else{
		if(key==T->key)
			return Delete(T);
		else if(key < T->key)
			return DeleteBST(T->lchild,key);
		else
			return DeleteBST(T->rchild,key); 
	}
}
int main(){
	BiTree T=NULL;
	createBST(T);
	inOrder(T);
	int n=1;
	do{
		printf("\n");
		scanf("%d",&n);
		DeleteBST(T,n); 
		inOrder(T);
	}while(n);
	return 0;
}

/*
key data
樣例輸入 :
3 2
1 3
2 -1
7 6
7 5
9 20
-2 1
0 1
*/


執行結果:


相關推薦

程式設計基礎79 給定排序結構陣列求整棵

1099 Build A Binary Search Tree (30 分) A Binary Search Tree (BST) is recursively defined as a binary tree which has the following properties: T

排序的結點刪除

8 3 9 2 6 10 1 4 7 5 上面是1到10的二叉排序樹。 如何實現二叉排序樹的節點刪除呢?假設我們刪除結點6,先尋找前驅結點或者後繼節點,6的前驅結點是5,後繼是7,想象一下

排序建立(JAVA實現)

      最近看了一下二叉排序樹的建立,自己寫了一段程式碼,用來建立二叉排序樹,給定一個數組,對這個陣列中的數字進行建立二叉排序樹。分兩種情況:      1  陣列中的數字是隨機的,也就是說沒有順序 eg : int  a [ ] = {3,1,2,5,0,7,9,8}

C++實現排序BSTree --插入刪除摧毀查詢等操作

#ifndef _BSTREE_H #define _BSTREE_H #include <iostream> #include <assert.h> using namespace std; template <typename T> class BSTree; t

排序的操作(建立、插入、刪除查詢)

二叉排序樹的建立、插入、刪除和查詢 #include <stdio.h> #include <stdlib.h> typedef struct node { int key; struct node *lchild,*rchild

排序建立刪除

實驗目的1.  掌握各種查詢方法的基本思想、特點及所適應的不同場合。2.  熟練掌握順序查詢、折半查詢、索引查詢、二叉排序樹查詢和雜湊表查詢演算法及其實現。3.  能用所學的查詢方法解決實際問題。實驗預習   在實驗預習報告上設計,編寫實驗內容的源程式,給程式加上適當的註釋,

查詢(3)——排序建立、結點的查詢刪除

#include <stdio.h> #include <stdlib.h> typedef struct node{ int data; node * lchild; node * rchild; }BTree

JAVA實現排序建立、中序遍歷、插入節點刪除節點操作)

JAVA實現二叉排序樹 二叉排序樹的定義 二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹: (1)若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值; (2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根結點的值; (3)左、

DS排序建立插入

DS二叉排序樹之建立和插入 時間限制: 1 Sec  記憶體限制: 128 MB 【Java有三倍的時間和記憶體限制】 題目描述 給出一個數據序列,建立二叉排序樹,並實現插入功能 對二叉排序樹進行中序遍歷,可以得到有序的

Java建立排序平衡

建立二叉排序樹,是從前往後掃描陣列,可以不保證高度最小,從頭節點依次向下尋找要插入的適當位置。 建立平衡樹,可以先將陣列進行排序,然後選取中間元素作為根節點,陣列中間元素左邊的元素為根節點的左子樹,陣列中間右邊的元素為根節點的右子樹。 再對右子樹和右子樹選取中間

查詢排序建立、插入、刪除、查詢-C語言

二叉查詢樹:或者是一顆空樹;或者是具有以下性質的二叉樹:(1)若它的左子樹不為空,則左子樹上所有結點的值都小於根結點的值;(2)若它的右子樹不為空,則右子樹所有結點的值均大於它的根結點的值;(3)左右子樹分別為二叉查詢樹; #include <std

排序建立查詢(面試常考)

在眾多查詢方法中,二叉排序樹查詢是比較好的一種查詢,其效率比順序查詢,折半查詢,插值查詢,斐波納契查詢等都要好。 二叉排序樹的建立 首先要了解而叉排序樹如何建立,給定一組陣列,建立一個而叉排序樹 #include <iostream>

排序的基本操作(建立,中序遍歷,查詢,刪除,插入)

分析: 二叉排序樹的操作的難點在於刪除操作,刪除操作時,只需要滿足二叉排序樹的性質即可,即需要找到要刪除結點p的左孩子的最右下方的數替代該結點的資料,然後刪除p->lchild的最右下方的結點即可。 對於p->lchild==NULL的,只需要讓雙親結點直接指向

排序建立遍歷

   輸入一系列整數,建立二叉排序樹,並進行前序、中序、後序遍歷。 #include <iostream> using namespace std; #include <stdio.h> #include <stdlib.h> typ

C++排序建立插入

加/**/表示另一種二叉排序樹的建立方法 第一類 #include <iostream> using namespace std; class TreeNode { public: int data; TreeNode *Le

【資料結構表的查詢】排序詳解程式碼(生成、插入、查詢、最大值、最小值、刪除、中序遍歷、銷燬)

二叉排序樹(簡稱BST)又稱二叉查詢(搜尋)樹,其定義為:二叉排序樹或者是空樹,或者是滿足如下性質的二叉樹:       (1)若它的左子樹非空,則左子樹上所有記錄的值均小於根記錄的值;       (2)若它的右子樹非空,則右子樹上所有記錄的值均大於根記錄的值;     

排序建立、插入、刪除、查詢、4種遍歷 C++完整實現

#include<iostream> #include<string> #include<queue> using namespace std; typedef int KeyType; #define NUM 13 class Bi

排序建立(結點的插入,刪除等操作)

二叉排序樹的理論看課本 程式碼如下: BSTree.h struct BSTreeNode; typedef struct BSTreeNode *ptrtreenode; void MakeEmpty(ptrtreenode T); ptrtreenode Inser

BST排序的查詢刪除的完整C程式碼

二叉排序樹的查詢演算法 假定二叉排序樹的根節點指標為root,給定的關鍵字值為key,則查詢演算法可描述為: 置初值:p = root ;如果 key = p -> data ,則查詢成功,演算法結束;否則,如果key < p->data ,而且 p 的

排序的插入刪除(嚴9.35、9.369.37)

Description假設二叉排序樹以後繼線索連結串列作儲存結構,編寫程式,滿足以下要求:輸出該二叉排序樹中所有大於a小於b的關鍵字;在二叉排序樹中插入一個關鍵字;在二叉排序樹中刪除一個關鍵字。Input第一行按先序輸入二叉排序樹各結點(結點值大於0),其中-1表示取消建立子