1. 程式人生 > >查詢(3)——二叉排序樹的建立、結點的查詢和刪除

查詢(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排序BSTC++封裝

二叉排序樹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 =

劍指offerC++——搜尋的第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