查詢(3)——二叉排序樹的建立、結點的查詢和刪除
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
int data;
node * lchild;
node * rchild;
}BTree;
void createBTree(BTree * root,int x){ //建立二叉排序樹
BTree * q, * p;
q = root;
while(q != NULL){
if(q->data == x){
goto L1;
}else if(q->data > x){
p = q;
q = q->lchild;
}else{
p = q;
q = q->rchild;
}
}
q = (BTree *)malloc(sizeof(BTree));
q->data = x;
q->lchild = NULL;
q->rchild = NULL;
if(p->data > x){
p-> lchild = q;
}else if(p->data < x){
p->rchild = q;
}
L1: ;
}
BTree * searchBTree(BTree * root,int x){ //在二叉排序樹中查詢給定的數值,返回指向該數的指標
BTree * q = root;
while(q != NULL){
if(q->data == x){
return q;
}else if(q->data > x){
q = q->lchild;
}else{
q = q->rchild;
}
}
return NULL;
}
/*
刪除二叉排序樹的一個結點需要考慮到:
(1)空樹-->退出
(2)只有一個結點並且這個結點的值與待刪除結點的值一致-->將該結點的指標置空
(3)多於一個結點時,迴圈找到該結點並且分類考慮如何刪除該結點
(3.1)該結點時葉子結點
(3.2)該結點只有左子樹
(3.3)該結點只有右子樹
(3.4)該結點即有左子樹又有右子樹
*/
void deleteBTree(BTree * root,int x){
BTree * p,* q,* r;
q = root;
if(q == NULL){
goto L1;
}else if(q->lchild == NULL && q->rchild == NULL && q->data == x){
q = NULL;
goto L1;
}else{
while(q != NULL){
if(q->data == x){
goto L2;
}else if(q->data > x){
p = q;
q = q->lchild;
}else{
p = q;
q = q->rchild;
}
}
if(q == NULL){
goto L1;
}
}
L1: ;
L2: if(q->lchild == NULL && q->rchild == NULL){ //當該結點是葉子結點
if(p->lchild == q){
p->lchild = NULL;
}else{
p->rchild = NULL;
}
}else if(q->lchild == NULL){ //當該結點只有右子樹
if(p->lchild == q){
p->lchild = q->rchild;
}else{
p->rchild = q->rchild;
}
}else if(q->rchild == NULL){ //當該結點只有左子樹
if(p->lchild == q){
p->lchild = q->lchild;
}else{
p->rchild = q->lchild;
}
}else{ //當該結點即有左子樹又有右子樹
r = q->rchild;
if(r->rchild == NULL && r->lchild == NULL){ //如果待刪除節點的右子樹只有一個結點時,直接拷貝該值,並置該結點的右指標為空
q->data = r->data;
q->rchild = NULL;
}else{
p = q;
while(r->lchild != NULL){ //while迴圈的目的是找到該結點右子樹的最左邊的結點
p = r;
r = r->lchild;
}
q->data = r->data;
if(p->lchild == r){ //當找到最左邊的結點時,相當於刪除一個無左子樹的結點
p->lchild = r->rchild;
}else{
p->rchild = r->rchild;
}
}
}
}
void inOrder(BTree * root){ //中序遞迴遍歷二叉排序樹
if(root != NULL){
inOrder(root->lchild);
printf("%d ",root->data);
inOrder(root->rchild);
}
}
int main(){
BTree * root, * q;
int n,x,k,t;
printf("請輸入結點的個數。\n");
scanf("%d",&n);
printf("請輸入結點的數值。\n");
for(int i=0;i<n;i++){
scanf("%d",&x);
if(i == 0){
root = (BTree *)malloc(sizeof(BTree));
root->data = x;
root->lchild = NULL;
root->rchild = NULL;
}else{
createBTree(root,x);
}
}
printf("二叉排序樹中所有的值為:\n");
inOrder(root);
printf("\n");
printf("請輸入要查詢的數。\n");
scanf("%d",&k);
while(k != -1){
q = searchBTree(root,k);
if(q == NULL){
printf("二叉排序樹中沒有該數。\n");
}else{
printf("找到要查詢的數%d\n",q->data);
}
printf("請輸入要查詢的數。\n");
scanf("%d",&k);
}
printf("請輸入要刪除的數\n");
scanf("%d",&t);
deleteBTree(root,t);
printf("刪除後的結果是:\n");
inOrder(root);
return 0;
}
相關推薦
查詢(3)——二叉排序樹的建立、結點的查詢和刪除
#include <stdio.h> #include <stdlib.h> typedef struct node{ int data; node * lchild; node * rchild; }BTree
構造二叉排序樹(BST)+二叉排序樹的刪除
主要是刪除操作 二叉排序樹的刪除 1. 刪除葉結點,直接刪除 2. 刪除結點p只有左子樹或右子樹,讓其子樹替代該結點p即可 3. 刪除結點p既有左子樹又有右子樹,以該結點p為根,查詢中序遍歷下第一個結點t,使這個結點t替換p結點(val覆蓋即可),再遞迴一次刪除這個結點t即
STL原始碼筆記(17)—二叉排序樹BST(C++封裝)
二叉排序樹BST STL中還有一類非常重要的容器,就是關聯容器,比如map啊set啊等等,這些容器說實話,在應用層上還不能完全得心應手(比如幾種容器效率的考慮等等),更別說原始碼了,因此這一部分打算穩紮穩打,好好做做筆記研究一番。 說到關聯容器,我們想到了什
資料結構與演算法(C語言) | 二叉排序樹
二叉排序樹的定義—— 二叉排序樹 ( Binary Sort Tree) 或者為空;或者是具有如下特性的二叉樹: (1)若根的左子樹不空,則左子樹上所有結點的關鍵字均小於根結點的關鍵字; (2)若
劍指offer學習筆記(Python)--二叉搜尋樹的後序遍歷序列
題目描述 輸入一個整數陣列,判斷該陣列是不是某二叉搜尋樹的後序遍歷的結果。如果是則輸出Yes,否則輸出No。假設輸入的陣列的任意兩個數字都互不相同。 思路 知識點回顧: 二叉搜尋樹(Binary Search Tree,BST)又稱二叉排序樹、二叉查詢樹  
基礎資料結構與演算法實現(2)—二叉搜尋樹BST
import java.util.LinkedList; import java.util.Queue; public class BST <E extends Comparable<E>> { private c
資料結構——樹(8)——二叉搜尋樹的插入和刪除操作
二叉搜尋樹的插入操作 我們要在二叉搜尋樹中執行各種操作的前提就是,我們首先要有一棵二叉搜尋樹。那麼,如何建立一棵二叉搜尋樹呢?最簡單的方法就是我們可以從一棵空樹開始,每次呼叫一個addNode函式,將一個新的值插入二叉搜尋樹中。但是在每次插入的時候我們都要保持
基於二叉排序樹的高校分數查詢系統
前述:該學期最後的資料結構的課程設計選題,於是記錄在自己部落格中,作為自己技術成長的點滴吧。 題目:高校最低錄取分數線的查詢 程式設計實現一個開放式的高校本科招生最低分數線的查詢系統,供師生及家長等查詢,高校自願放入該校的資訊,可能隨時有高
資料結構——樹(7)——二叉搜尋樹及其操作原理
二叉樹與二叉搜尋樹 在之前的文章中,我們提到過三叉樹,n叉樹,但是我們實際用的最多卻是二叉樹,因為這樣的結構更適合我們程式設計和更適合我們使用遞迴的方式。所以我們可以限制孩子的數量使得生成的樹更容易實施。那麼怎麼定義二叉樹呢? - 樹中的每個節點至多有兩個孩
劍指offer——(24)二叉搜尋樹的後序遍歷序列
public class Solution { public boolean VerifySquenceOfBST(int [] sequence) { if(sequence.length==0) return false; if(sequence.lengt
劍指offer——(20)二叉搜尋樹的第k個結點
最近作業好多 幾門結課作業一起來 很煩啊 中序遍歷二叉搜尋樹得到的就是升序的結點排列,遍歷的時候加個判斷是不是第k個結點就行了。 /* public class TreeNode { int val = 0; TreeNode left =
劍指offer(C++)——二叉搜尋樹的第k個結點
題目描述 給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 按結點數值大小順序第三個結點的值為4。 思路:根據二叉搜尋樹的特點,中序遍歷的數值是遞增排序的,因此,只需中序遍歷二叉搜
【資料結構】資料結構探索(三) —— 二叉搜尋樹(Binary Search Tree)
二叉搜尋樹是一種有順序的二叉樹,它具有以下特徵: 1.每個元素有一個關鍵字,並且任意兩個元素的關鍵字都不同;因此所有的關鍵字都是唯一的。 2.在根節點的左子樹中,元素的關鍵字(如果有的話)都小於根節點的關鍵字。 3.在根節點的右子樹中,元素的關鍵字(如果有的話)都大
二叉排序樹的構造,插入,刪除,完整c程式碼實現
#include <stdio.h> #include <stdlib.h> typedef struct BiTNode{ int data; s
二叉排序樹 分析、梳理、程式碼總結
二叉排序樹(binary sort tree) 二叉排序樹的定義 二叉排序樹或是一棵空樹,或是具有如下性質的非空二叉樹: (1)若它的左子樹非空,則其左子樹所有結點的關鍵字值均小於其根結點的關鍵字值 (2)若它的右子樹非空,則其右子樹所有
二叉排序樹建立(JAVA實現)
最近看了一下二叉排序樹的建立,自己寫了一段程式碼,用來建立二叉排序樹,給定一個數組,對這個陣列中的數字進行建立二叉排序樹。分兩種情況: 1 陣列中的數字是隨機的,也就是說沒有順序 eg : int a [ ] = {3,1,2,5,0,7,9,8}
二叉搜尋樹建立、插入、刪除、前繼節點、後繼節點之c++實現
#include "stdafx.h" #include <string> #include <stdlib.h> #include <iostream> using namespace std; typedef struct Node { int key;
【模板】二叉搜尋樹(二叉排序樹,二叉查詢樹,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
資料結構實驗之查詢一:二叉排序樹 (SDUT 3373)
二叉排序樹(Binary Sort Tree),又稱二叉查詢樹(Binary Search Tree),也稱二叉搜尋樹。 #include <stdio.h> #include <string.h> #include <stdlib.h> struct nod
二叉查詢樹(二叉排序樹)建立、插入、刪除、查詢-C語言
二叉查詢樹:或者是一顆空樹;或者是具有以下性質的二叉樹:(1)若它的左子樹不為空,則左子樹上所有結點的值都小於根結點的值;(2)若它的右子樹不為空,則右子樹所有結點的值均大於它的根結點的值;(3)左右子樹分別為二叉查詢樹; #include <std