1. 程式人生 > >二叉排序樹——完整程式碼實現

二叉排序樹——完整程式碼實現

   二叉排序樹,又稱二叉查詢樹。它或者是一顆空樹,或者是具有下列性質的二叉樹。

(1)      若他的左子樹不為空,則左子樹上所有結點的值均小於他的根結點的值。

(2)      若他的右子樹不為空,則右子樹上所有結點的值均大於他的根結點的值。

(3)      他的左右子樹也分別是二叉排序樹。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
using namespace std;
typedef struct BiTNode
{
    int data;
    struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
bool SearchBST(BiTree T,int key,BiTree f,BiTree *p)
{
    if(!T)//查詢不成功
    {
        *p=f;
        return false;
    }
    else if(key==T->data)//查詢成功
    {
        *p=T;
        return true;
    }
    else if(key<T->data)//查詢左子樹
        return SearchBST(T->lchild,key,T,p);
    else//查詢右子樹
        return SearchBST(T->rchild,key,T,p);
}
bool InsertBST(BiTree *T,int key)
{
    BiTree p,s;
    if(!SearchBST(*T,key,NULL,&p))
    {
        s=(BiTree)malloc(sizeof(BiTNode));
        s->data=key;
        s->lchild=s->rchild=NULL;
        if(!p)//該樹為空樹,s為根節點
            *T=s;
        else if(key<p->data)
            p->lchild=s;//s為左孩子
        else
            p->rchild=s;//s為右孩子
        return true;
    }
    return false; //已存在該節點
}
/*從二叉排序樹中刪除節點p,並重新接上他的左、右子樹*/
bool Delete(BiTree *p)
{
    BiTree q,s;
    if((*p)->rchild==NULL)//右子樹為空,只需要重接他的左子樹
    {
        q=*p;
        *p=(*p)->lchild;
        free(q);
    }
    else if((*p)->lchild==NULL)//左子樹為空,只需要重接他的右子樹
    {
        q=*p;
        *p=(*p)->rchild;
        free(q);
    }
    else//左右子樹均不為空
    {
        q=*p;
        s=(*p)->lchild;
        while(s->rchild)//轉左,然後向右走到盡頭,找p的前驅。
        {
            q=s;
            s=s->rchild;
        }
        (*p)->data=s->data;//s指向被刪結點的直接前驅,然後用s來替換p
        if(q!=*p)//如果p,q指向不同的結點,則表明s結點下面還有右子樹。
            q->rchild=s->lchild;//重接q的右子樹。
        else
            q->lchild=s->lchild;//重接q的左子樹。
        free(s);
    }
    return true;
}
bool DeleteBST(BiTree *T,int key)
{
    if(!*T)//查詢不成功
    {
        return false;
    }
    else if(key==(*T)->data)//查詢成功
    {
        return Delete(T);
    }
    else if(key<(*T)->data)//查詢左子樹
        return DeleteBST(&(*T)->lchild,key);
    else//查詢右子樹
        return DeleteBST(&(*T)->rchild,key);
}
void InOrderTraverse(BiTree T)//中序遍歷
{
    if(T==NULL)
        return;
    InOrderTraverse(T->lchild);
    printf("%d ",T->data);
    InOrderTraverse(T->rchild);
}
int main()
{
    int a[]={62,88,58,47,35,73,51,99,37,93};
    BiTree T=NULL;
    for(int i=0;i<10;i++)
        InsertBST(&T,a[i]);
    InOrderTraverse(T);
    cout<<endl;
    cout<<"請輸入要插入的資料"<<endl;
    int key;
    cin>>key;
    if(InsertBST(&T,key))
    {
        cout<<"插入成功"<<endl;
        InOrderTraverse(T);
        cout<<endl;
    }
    else
        cout<<"插入失敗"<<endl;
    cout<<"請輸入要刪除的資料"<<endl;
    cin>>key;
    if(DeleteBST(&T,key))
    {
        cout<<"刪除成功"<<endl;
        InOrderTraverse(T);
        cout<<endl;
    }
    else
        cout<<"刪除失敗"<<endl;
    return 0;
}


相關推薦

排序——完整程式碼實現

   二叉排序樹,又稱二叉查詢樹。它或者是一顆空樹,或者是具有下列性質的二叉樹。 (1)      若他的左子樹不為空,則左子樹上所有結點的值均小於他的根結點的值。 (2)      若他的右子樹不為空,則右子樹上所有結點的值均大於他的根結點的值。 (3)      他的左

基礎操作 ,前中後序遍歷,求高度,搜尋排序)Java實現 程式碼集合

首先,定義一個樹類Tree.java public class Tree { public TreeNode root; } 定義樹節點類TreeNode.java public class TreeNode { public TreeNode(int

資料結構圖文解析之:的簡介及排序C++模板實現.

  閱讀目錄 0. 資料結構圖文解析系列 1. 樹的簡介 1.1 樹的特徵 1.2 樹的相關概念 2. 二叉樹簡介 2.1 二叉樹的定義 2.2 斜樹、滿二叉樹、完全二叉樹、二叉查詢樹 2

排序C語言實現

目錄 目錄 說明 程式碼 一些思考 說明 用C語言實現資料結構,二叉排序樹,可動態插入二叉樹結點,

查詢(排序)的詳細實現

1、序      詳細實現了二叉查詢樹的各種操作:插入結點、構造二叉樹、刪除結點、查詢、  查詢最大值、查詢最小值、查詢指定結點的前驅和後繼 2、二叉查詢樹簡介      它或者是一棵空樹;或者是具有下列性質的二叉樹: (1)若左子樹不空,則左子樹上所有結點的值均小於它的根

排序C語言實現

一、定義:   二叉排序樹(二叉搜尋樹、二叉查詢樹)或者是空樹,或者滿足以下性質:` (1)若它的左子樹非空,則左子樹上所有記錄的值均小於根記錄的值; (2)若它的右子樹非空,則右子樹上所有記錄的值均大於根記錄的值; (3)左、右子樹本身又各是一顆二叉排序樹。     ——

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

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

資料結構 排序 操作及實現

#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> using namespace std; typedef struct Bitn

排序的java實現

最近在看JDK原始碼時,發現JDK的J.U.C包下面的很多類都用到了二叉排序樹和紅黑樹,就想著這一塊還是考研的時候看了的,順便就在理論基礎上覆習加用Java做個實現。 二叉排序樹 先來說說這個二叉排序樹的定義和性質: 定義:二叉排序樹或者

排序基本功能實現(C++)

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

排序建立(JAVA實現)

      最近看了一下二叉排序樹的建立,自己寫了一段程式碼,用來建立二叉排序樹,給定一個數組,對這個陣列中的數字進行建立二叉排序樹。分兩種情況:      1  陣列中的數字是隨機的,也就是說沒有順序 eg : int  a [ ] = {3,1,2,5,0,7,9,8}

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

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

排序程式碼實現

參照《大話資料結構》 313 ~328頁 #include <iostream> #include <stdio.h> #include <stdlib.h> #include <string.h> using names

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

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

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

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

BST排序的查詢和刪除的完整C程式碼

二叉排序樹的查詢演算法 假定二叉排序樹的根節點指標為root,給定的關鍵字值為key,則查詢演算法可描述為: 置初值:p = root ;如果 key = p -> data ,則查詢成功,演算法結束;否則,如果key < p->data ,而且 p 的

js 實現排序

struct rip != function 一個 ons || 二叉排序樹 arr 二叉排序樹或者是一棵空樹,或者是具有下列性質的二叉樹: (1)若左子樹不空,則左子樹上所有結點的值均小於或等於它的根結點的值; (2)若右子樹不空,則右子樹上所有結點的值均大於或等於它的根

java實現平衡排序增刪

在學習了普通二叉排序樹的演算法之後,我們發現了它的一些不足,如果我們的普通二叉樹在插入資料的時候造成樹的一側資料過多的話,就會使得查詢的時候效率大大降低,在極端情況下,我們插入一串有序的數,原本的二叉樹就會變成連結串列,例如,插入:1,2,3,4,5,6,結果就會變成下圖這樣: 這樣就

排序查詢演算法之php實現

        二叉排序樹,又稱為二叉查詢樹。它或者是一棵空樹,或者是具有下列性質的二叉樹。                1.若它的左子樹不空,則左子樹上所有結點的值均小於它的根結點的值                2.若它的右子樹不空,則右子樹上所有結點的值均小於它

go語言實現排序及其前序遍歷

結構  左右指標和存值的一個int type AVL struct{ left,right *AVL value int } 獲取左右節點的指標 func (a *AVL)getLeft()(*AVL) { if a.left != nil{ return