1. 程式人生 > >7. 二叉排序樹的搜尋、插入、刪除,時間複雜度

7. 二叉排序樹的搜尋、插入、刪除,時間複雜度

template<class T>
struct BiNode
{
	T data;
	BiNode<T>*lchild,rchild;
}
class BiSortTree
{
 public:
	BiSortTree(int a[],int n);
	~BiSortTree();
	void InsertBST(BiNode<int>*root,BiNode<int>*s);
	void DeleteBST(BiNode<int>*p,BiNode<int>*f);
	BiNode<int>*SearchBST(BiNode<int>*root,int k);
 private:
	BiNode<int>*root;
}

void BiSortTree::InsertBST(BiNode<int>*root,BiNode<int>*s)
{
	if(root==NULL)
		root=s;
	else if(s->data<root->data)
		InsertBST(root->lchild,s);
	else
		InsertBST(root->rchild,s);
}	

BiSortTree::BiSortTree(int r[],int n)
{
	for(int i=0;i<n;i++)
	{
		BiNode<int>s=new BiNode<int>;
		s->data=r[i];
		s->lchild=s->rchild=NULL;
		InsertBST(root,s);
	}
}
//在二叉排序樹中刪除一個節點f的左孩子節點p的演算法:
//1.若節點p是葉子,則直接刪除節點p
//2.若節點p只有左子樹,則需重接p的左子樹;若節點p只有右子樹,則需重接p的右子樹
//3.若節點p的左右子樹都不為空,則
//	3.1查詢節點p的右子樹上的最左下節點s以及節點s的雙親節點par
//	3.2將節點s的資料域替換到被刪除節點p的資料域
//	3.3若節點p的右孩子無左子樹,則將s的右子樹接到par的右子樹上;否則將s的右子樹接到節點par的左子樹上
//	3.4刪除節點s;
void BiSortTree::DeleteBST(BiNode<int>*p,BiNode<int>*f)
{
	if((p->lchild==NULL)&&(p->rchild)==NULL)
	{
		f->lchild=NULL;
		delete p;
	}
	else if(p->rchild==NULL)
	{
		f->lchild=p->lchild;
		delete p;
	}
	else if(p->lchild==NULL)
	{
		f->lchild=p->rchild;
		delete p;
	}
	else{
		BiNode<int>*par=p;
		BiNode<int>*s=p->rchild;
		while(s->lchild!=NULL)
		{
			par=s;
			s=s->lchild
		}
		p->data=s->data;
		if(par==p)
			par->rchild=s->rchild;
		else
			par->lchild=s->rchild;
		delete s;
		
	}
	
}
BiNode<int>*BiSortTree::SearchBST(BiNode<int>*root,int k)
{
	if(root==NULL)
		return NULL;
	else if(root->data==k)
		return root;
	else if(root->date>k)
		return SearchBST(root->lchild,k);
	else if(root->data<k)
		return SearchBST(root->rchild,k);
}

給定值的比較次數等於給定值節點在二叉排序樹中的層數。如果二叉排序樹是平衡的,則n個節點的二叉排序樹的高度為Log2n+1,其查詢效率為O(Log2n),近似於折半查詢。如果二叉排序樹完全不平衡,則其深度可達到n,查詢效率為O(n),退化為順序查詢。一般的,二叉排序樹的查詢效能在O(Log2n)到O(n)之間。因此,為了獲得較好的查詢效能,就要構造一棵平衡的二叉排序樹。

相關推薦

BST(排序)的插入刪除

最小值 temp def oot gpo 一個 記錄 通過 如果 值得一說的是刪除操作,刪除操作我們分為三種情況: 1.要刪的節點有兩個孩子:   找到左子樹中的最大值或者右子樹中的最小值所對應的節點,記為node,並把node的值賦給要刪除的節點del,然後刪除node

7. 排序搜尋插入刪除時間複雜

template<class T> struct BiNode { T data; BiNode<T>*lchild,rchild; } class BiSortTree { public: BiSortTree(int a[],int n); ~BiSortTree();

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

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

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

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

Java實現排序插入查詢刪除

import java.util.Random; /** * 二叉排序樹(又稱二叉查詢樹) * (1)可以是一顆空樹 * (2)若左子樹不空,則左子樹上所有的結點的值均小於她的根節點的值 * (3)若右子樹不空,則右子樹上所有的結點的值均大於她的根節點的值

手寫排序(查詢搜尋)

二叉排序樹(查詢樹,搜尋樹)或者是一顆空樹,或者是一顆具有如下性質的樹: 1)若左子樹不為空,那麼左子樹上面的所有節點的關鍵字值都比根節點的關鍵字值小 2)若右子樹不為空,那麼右子樹上面的所有節點的關鍵字值都比根節點的關鍵字值大 3)左右子樹都為二叉樹 4)沒有重複值(這一點在實際中可以忽略)

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

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

重溫資料結構:排序的查詢插入刪除

讀完本文你將瞭解到: 我們知道,二分查詢可以縮短查詢的時間,但是有個要求就是 查詢的資料必須是有序的。每次查詢、操作時都要維護一個有序的資料集,於是有了二叉排序樹這個概念。 上篇文章 我們介紹了 二叉樹 的概念,二叉樹有左右子樹之分,想必在區分左右子樹

排序(Binary Sort Tree)查詢插入刪除 Java實現

順序儲存的插入和刪除可以通過在表末端插入和刪除元素同最後一個元素互換來保持高效率,但是無序造成查詢的效率很低。 如果查詢的資料表是有序線性表,並且是順序儲存的,查詢可以折半、插值、斐波那契等查詢演算法來實現,但是因為有序在插入和刪除操作上,就需要耗費大量時間。 二叉排序樹可

排序(查詢插入刪除

“二叉排序樹,又稱為二叉查詢樹。它或者是一顆空樹,或者具有下列性質的二叉樹。 若它的左子樹不空,則左子樹上所有節點的值均小於它的根節點的值; 若它的右子樹不空,則右子樹上所有節點的值均大於它的根節點的值; 它的左、右子樹也分別為二叉排序樹。 構造一顆二叉排序樹的目的,

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

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

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

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

排序插入刪除(嚴9.359.36和9.37)

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

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

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

排序插入刪除

else post 相等 大於 truct art parent node -m 二叉排序樹的插入與刪除可能會破壞二叉排序樹的性質,如今要求插入和刪除操作保持其性質 二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹: (1)若左子樹不空,則左子樹上全部結點的

排序插入C語言版 遞歸步驟理解

pan 形參 排序樹 tno btn 排序 all png spa 1 //二叉排序樹 插入 (純C語言實現) 2 BTNode * BSTInsert2(BTNode *bt,int key){ 3

【模板】搜尋排序查詢BST)

二叉搜尋樹其實就是滿足左結點小於根,右結點大於根這類規則的樹形結構。  1 int n; 2 int a[MAX_N]; 3 int lt[MAX_N], rt[MAX_N]; 4 // 沒有則為-1 5 // 預設a[0]為根結點 6 7 void Insert(int

DS排序之建立和插入

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

排序的構造插入刪除完整c程式碼實現

#include <stdio.h>   #include <stdlib.h>    typedef struct BiTNode{       int data;       s

C語言 - 排序/搜尋

二叉排序樹可以看做是一個較好的資料儲存模型,因為在二叉排序樹中有屬於它自己的一套方法對資料進行高效操作: 1> 資料的鏈式儲存 2> 資料的排序 (有序讀取) 3> 查詢資料(指定資料,最大值、最小值) 4> 資料的刪除 (更新ing...)