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