1. 程式人生 > >二叉排序樹的插入和刪除(嚴9.35、9.36和9.37)

二叉排序樹的插入和刪除(嚴9.35、9.36和9.37)

Description

假設二叉排序樹以後繼線索連結串列作儲存結構,編寫程式,滿足以下要求:
輸出該二叉排序樹中所有大於a小於b的關鍵字;
在二叉排序樹中插入一個關鍵字;
在二叉排序樹中刪除一個關鍵字。

Input

第一行按先序輸入二叉排序樹各結點(結點值大於0),其中-1表示取消建立子樹結點;第二行輸入要求1中a、b,用空格隔開;第三行輸入要求2中要插入的關鍵字;第四行輸入要求3中要刪除的關鍵字。

Output

按照中序序列,分三行輸出要求1、要求2和要求3的結果。

  • Sample Input 
    12 8 4 -1 -1 10 -1 -1 16 13 -1 -1 18 -1 -1
    10 17
    6
    12
  • Sample Output
    12 13 16
    4 6 8 10 12 13 16 18
    4 8 10 13 16 18
#include<stdio.h>
#include<stdlib.h>

typedef struct BinNode{
    int data;
    struct BinNode *lchild;
    struct BinNode *rchild;
}BinNode,*BinTree;

void CreateBinTree(BinTree *tree)
{
    int ch;
    scanf("%d",&ch);

    if(ch == -1)
    {
        (*tree) = NULL;
    }
    else
    {
        *tree = (BinTree)malloc(sizeof(BinNode));
        (*tree)->data = ch;
        CreateBinTree(&((*tree)->lchild));
        CreateBinTree(&((*tree)->rchild));
    }
}

void Search(BinTree T,int m,int n)
{
    if(T)
    {
        Search(T->lchild,m,n);
        if(T->data > m&& T->data < n)printf("%d ",T->data);
        Search(T->rchild,m,n);
    }
}

void Inorder(BinTree T)
{
    if(T)
    {
        Inorder(T->lchild);
        printf("%d ",T->data);
        Inorder(T->rchild);
    }
}
void Insert(BinTree *T,int key)
{
    if(!(*T))
    {
        (*T) = (BinTree)malloc(sizeof(BinNode));
        (*T)->data = key;
        (*T)->lchild = (*T)->rchild = NULL;
        return;
    }
    if(key == (*T)->data )
        return;
    if(key > (*T)->data )
        Insert( &((*T)->rchild), key );
    else
        Insert( &((*T)->lchild), key );
}

bool Delete(BinTree *T)
{
    BinTree L;
    if (!(*T)->lchild && !(*T)->rchild)
        *T = NULL;
    else if (!(*T)->lchild)
        *T = (*T)->rchild;
    else if (!(*T)->rchild)
        *T = (*T)->lchild;
    else
    {
        L = (*T)->lchild;
        while (L->rchild)
            L = L->rchild;
        L->rchild = (*T)->rchild;
        *T = (*T)->lchild;
    }
    return true;
}
bool DeleteBST(BinTree *T, int key)
{
    if (!*T)
        return false;
    else if (key == (*T)->data)
    {
        Delete(T);
        return true;
    }
    else if (key < (*T)->data)
    {
        return DeleteBST(&((*T)->lchild), key);
    }
    else
    {
        return DeleteBST(&((*T)->rchild), key);
    }
}

int main(){
    BinTree T = NULL;
    CreateBinTree(&T);
    int m,n,w,k;
    scanf("%d %d",&m,&n);
    scanf("%d",&w);
    scanf("%d",&k);
    Search(T,m,n);
    printf("\n");
    Insert(&T,w);
    Inorder(T);
    printf("\n");
    DeleteBST(&T,w);
    DeleteBST(&T,k);
    Inorder(T);
    printf("\n");
    return 0;
}

刪除節點的情況有點複雜QAQ

刪除的另一種情況:

BinTree Delete( BinTree BST, ElementType X ) 
{ 
    Position Tmp; 
 
    if( !BST ) 
        printf("要刪除的元素未找到"); 
    else {
        if( X < BST->Data ) 
            BST->Left = Delete( BST->Left, X );   /* 從左子樹遞迴刪除 */
        else if( X > BST->Data ) 
            BST->Right = Delete( BST->Right, X ); /* 從右子樹遞迴刪除 */
        else { /* BST就是要刪除的結點 */
            /* 如果被刪除結點有左右兩個子結點 */ 
            if( BST->Left && BST->Right ) {
                /* 從右子樹中找最小的元素填充刪除結點 */
                Tmp = FindMin( BST->Right );
                BST->Data = Tmp->Data;
                /* 從右子樹中刪除最小元素 */
                BST->Right = Delete( BST->Right, BST->Data );
            }
            else { /* 被刪除結點有一個或無子結點 */
                Tmp = BST; 
                if( !BST->Left )       /* 只有右孩子或無子結點 */
                    BST = BST->Right; 
                else                   /* 只有左孩子 */
                    BST = BST->Left;
                free( Tmp );
            }
        }
    }
    return BST;
}

相關推薦

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

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

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

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

第九章查詢表-排序-計算機17級帶詳細解析

解析在後面:       解析: x2-1:   要注意這個二叉搜尋樹還是個完全二叉樹,只有二叉樹時最大值才一定在葉結點上,且中位值一定要注意,肯定是在根結點或根的左子樹上 x2-2:之前就做過,畫出圖就好了 x2

排序平均檢索長度ASL的演算法

對於二叉排序樹的ASL演算法 二叉排序樹的特點是左孩子小於根節點,右孩子大於根節點 之前尋找部落格上計算ASL的演算法時,看到用的是設定一個max值來判斷是否換層,遍歷二叉排序樹,若是大於max則是屬於同一層,賦值給max,直到找到小於max的節點就是下一層,但是對於如果一層中只有最

排序插入演算法之php實現

        插入是基於查詢的過程,如果找不到,通過最後一個被查詢的節點判斷,如果查詢值小於該節點,將查詢值賦予 該節點的左孩子,否則賦予該節點的右孩子。         程式碼如下: <

排序的基本操作完整程式碼

以下是二叉排序樹的基本操作,函式基本與《大話資料結構》裡的程式碼類似,包括查詢、插入、刪除操作。完整程式碼,可直接執行。 //二叉排序樹 //其中有插入、刪除、查詢操作 #include<s

排序,java實現知識簡單的實現,持續完善更新

定義: 二叉排序樹就是左子樹都比節點小,右子樹都比節點大。簡單的排序二叉樹實現。 程式碼: package com.wzq.data_structure; public class Bina

排序的結點刪除

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

排序基本功能實現C++

二叉排序樹(Binary Sort Tree )也稱二叉搜尋樹(Binary Search Tree),以下簡稱BST。 它的特點是左小右大(左子樹小於根,右子樹大於根),令人困惑的是他不允許相等存在,一定要分個高低。這個特點與二叉堆排序有所不同,堆是允許存在相同關鍵字

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

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

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

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

排序插入刪除9.359.369.37

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

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

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

BST排序插入刪除

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

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

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

排序新建,插入,查詢,刪除C語言編寫

#include<stdio.h> #include <stdlib.h> typedef struct BSTNode{         int data;         struct BSTNode *lchild,*rchild; }BSTN

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

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

排序查詢插入刪除

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

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

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

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

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