国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)二叉排序樹的建立、插入、刪除、查找操作(原理+完整代碼)

這篇具有很好參考價(jià)值的文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)二叉排序樹的建立、插入、刪除、查找操作(原理+完整代碼)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

完整代碼

#include<stdio.h>
#include<stdlib.h>

typedef struct binode
{
    int data;
    struct binode *lchild,*rchild;
}BiTNode,*BiTree;

//查找函數(shù)
//f指向T的parent,查找成功p指向該結(jié)點(diǎn);不成功,返回訪問的最后一個(gè)結(jié)點(diǎn)
int searchBST(BiTree T,int key, BiTree f, BiTree *p)
{
    if(T==NULL)
    {
        *p= f;
        return 0;
    }
    else if(key == T->data)
    {
        *p=T;
        return 1;
    }
    else if(key < T ->data)
    {
        return searchBST(T->lchild, key, T,p);
    }
    else{
        return searchBST(T->rchild, key, T,p);
    }
}

//插入節(jié)點(diǎn)(創(chuàng)建樹)
int insertBST(BiTree *T,int key)
{
    BiTree p,s;
    if(searchBST(*T,key,NULL,&p)==0)   //查找不成功,不存在相等的結(jié)點(diǎn)
    {
        s=(BiTree)malloc(sizeof(BiTNode));
        s->data=key;
        s->lchild=s->rchild=NULL;
        if(!p)
            *T=s;   //樹為空,則s為根節(jié)點(diǎn)
        else if(key < p->data)
            p->lchild=s;
        else
            p->rchild=s;
        return 1;
    }
    else
        return 0;
}

//刪除
int 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)   //找到被刪結(jié)點(diǎn)的左子樹的最右結(jié)點(diǎn)
        {
            q=s; s=s->rchild;
        }
        (*p)->data = s->data;    //此時(shí)s為被刪結(jié)點(diǎn)的左子樹的最右結(jié)點(diǎn)
        if(q != *p)           //q為s 的父親結(jié)點(diǎn),此時(shí)q不重合p,也就是s不是p的右孩子
            q->rchild=s->lchild;
        else                         //此時(shí)q和p重合,s為p的右孩子
            q->lchild=s->lchild;
        free(s);
    }
    return 1;
}
//遞歸找到結(jié)點(diǎn)
int deleteBST(BiTree *T, int key)
{
    if(*T==NULL)
        return 0;
    else
    {
        if(key == (*T)->data)
        {
            Delete(T);
            return 1;
        }
        else if(key <(*T)->data)
            return deleteBST(&(*T)->lchild,key);
        else
            return deleteBST(&(*T)->rchild,key);
    }
}

void pre(BiTree T)
{
    if(T)
    {
        printf("%d ",T->data);
        pre(T->lchild);
        pre(T->rchild);
    }
}
int main()
{
    BiTree T=NULL;
    int a[15]={3,6,1,8,2,7,4,5,66};
    int i=0;
    while(a[i]!='\0')
    {
        insertBST(&T,a[i++]);
    }
    pre(T);
    printf("\n1.插入節(jié)點(diǎn) 2.刪除結(jié)點(diǎn)\n");
    int f;int key;
    scanf("%d",&f);
    if(f==1)
    {
        printf("請(qǐng)輸入插入的數(shù)字\n");
        scanf("%d",&key);
        insertBST(&T,key);
        pre(T);
    }
    else
    {
        printf("請(qǐng)輸入刪除的數(shù)字\n");
        scanf("%d",&key);
        deleteBST(&T,key);
        pre(T);
    }
    
    return 0;
}

二叉查找樹的原理

1、若左子樹不為空,左子樹上所有節(jié)點(diǎn)值小于 它根節(jié)點(diǎn)的值
2、若右子樹不為空,右子樹上所有節(jié)點(diǎn)值大于 它根節(jié)點(diǎn)的值
3、每個(gè)節(jié)點(diǎn)的左右子樹也是二叉排序樹

目的:提高查找、插入、刪除關(guān)鍵字的速度(不是為了排序)
時(shí)間復(fù)雜度:由于查找性能取決于樹的形態(tài),所以在O(log2n)(二叉樹的平均高度)~ O(n) (最壞情況:?jiǎn)捂湵恚┲g。
二叉排序樹的深度、性能不穩(wěn)定
改進(jìn):AVL樹(不斷的修改樹的形態(tài)) 鏈接: 二叉平衡樹(AVL樹)

插入

查找不成功(不重復(fù)) -> 插入

刪除

分為三種情況:
(1)為葉子結(jié)點(diǎn) :直接刪除
(2)無(wú)左、右子樹:刪除結(jié)點(diǎn),接上孩子即可
(3)左、右子樹都有:找需要?jiǎng)h除結(jié)點(diǎn)的左子樹的最右結(jié)點(diǎn)(或右子樹的最左結(jié)點(diǎn))替換此節(jié)點(diǎn)。因?yàn)樽笞訕涞淖钣医Y(jié)點(diǎn)和右子樹的最左結(jié)點(diǎn)最接近根節(jié)點(diǎn),所以用它替換。再把此節(jié)點(diǎn)的右或左子樹接到此節(jié)點(diǎn)的父親結(jié)點(diǎn)上。

查找

通過遞歸的方式比較找到結(jié)點(diǎn)
查找需要為插入做準(zhǔn)備,因此函數(shù)變量里有個(gè)指針。

參考資料:《大話數(shù)據(jù)結(jié)構(gòu)》
如果文章有問題,請(qǐng)給我留言哦,謝謝!文章來源地址http://www.zghlxwxcb.cn/news/detail-490096.html

到了這里,關(guān)于C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)二叉排序樹的建立、插入、刪除、查找操作(原理+完整代碼)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 二叉排序樹的創(chuàng)建、插入、查找和刪除【數(shù)據(jù)結(jié)構(gòu)】

    若它的左子樹不空,則左子樹上所有結(jié)點(diǎn)的值均小于它根結(jié)點(diǎn)的值。 若它的右子樹不空,則右子樹上所有結(jié)點(diǎn)的值均大于它根結(jié)點(diǎn)的值。 它的左、右樹又分為?叉排序樹 二叉排序樹也叫二叉查找樹、二叉搜索樹 題目描述 給出一個(gè)數(shù)據(jù)序列,建立二叉排序樹,并實(shí)現(xiàn)插入功

    2024年01月24日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu)課設(shè)(五)二叉排序樹與平衡二叉樹的實(shí)現(xiàn)

    假定二叉排序樹與平題所處理數(shù)據(jù)均為整型。分別采用二叉鏈表和順序表作存儲(chǔ)結(jié)構(gòu),實(shí)現(xiàn)對(duì)二叉衡二叉樹的操作。具體要求如下: (1)用二叉鏈表作存儲(chǔ)結(jié)構(gòu): ①讀入一個(gè)整數(shù)序列L(要求該整數(shù)序列從磁盤文件讀取),生成一棵二叉排序樹②對(duì)二叉排序樹T作中序遍歷,輸出結(jié)果

    2024年02月12日
    瀏覽(22)
  • 數(shù)據(jù)結(jié)構(gòu)----完全二叉樹的時(shí)間復(fù)雜度講解,堆排序

    數(shù)據(jù)結(jié)構(gòu)----完全二叉樹的時(shí)間復(fù)雜度講解,堆排序

    目錄 一.建堆的時(shí)間復(fù)雜度 1.向上調(diào)整算法建堆 2.向下調(diào)整算法建堆 二.堆排序 1.概念 2.代碼思路 3.代碼實(shí)現(xiàn) 我們就以極端情況考慮時(shí)間復(fù)雜度(滿二叉樹+遍歷所有層) 假設(shè)所有節(jié)點(diǎn)個(gè)數(shù)為N,樹的高度為h N = 2^0+2^1+2^2......+2^(h-1) 即N = 2^h - 1 h = log(N+1) 時(shí)間復(fù)雜度我們以交換次數(shù)為

    2024年03月14日
    瀏覽(30)
  • 二叉排序樹的插入刪除和查找(數(shù)據(jù)結(jié)構(gòu)實(shí)訓(xùn))(難度系數(shù)100)

    二叉排序樹的插入刪除和查找 pre: 前序遍歷 in: 中序遍歷 post:后序遍歷 insert: 插入,本題中不會(huì)出現(xiàn)相同的元素 delete: 刪除,刪除成功輸出TRUE,沒有該元素則輸出FALSE,刪除的方法是如果有左子樹,以左子樹中最大值作為新的樹根,否則,以右子樹最小值作為樹根。 search:

    2024年01月25日
    瀏覽(24)
  • 二叉樹的實(shí)現(xiàn)(C語(yǔ)言數(shù)據(jù)結(jié)構(gòu))

    二叉樹的實(shí)現(xiàn)(C語(yǔ)言數(shù)據(jù)結(jié)構(gòu))

    目錄 一、以下是我們需要實(shí)現(xiàn)的功能 二、以下是我們具體功能的實(shí)現(xiàn) 1.創(chuàng)建新的結(jié)點(diǎn) 2.通過數(shù)組生成二叉樹 ?3.先序遍歷 4.中序遍歷 5.后序遍歷? ?6.層序遍歷 7.計(jì)算二叉樹的結(jié)點(diǎn)個(gè)數(shù) 8.查找指定值為x的結(jié)點(diǎn) 9.查找第K層的結(jié)點(diǎn)個(gè)數(shù) 10.統(tǒng)計(jì)二叉樹葉子結(jié)點(diǎn)的個(gè)數(shù) 11.判斷是否為

    2024年02月04日
    瀏覽(19)
  • 【C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)】二叉樹的遍歷

    【C語(yǔ)言 數(shù)據(jù)結(jié)構(gòu)】二叉樹的遍歷

    所謂先序遍歷二叉樹,指的是從根結(jié)點(diǎn)出發(fā),按照以下步驟訪問二叉樹的每個(gè)結(jié)點(diǎn): 訪問當(dāng)前結(jié)點(diǎn); 進(jìn)入當(dāng)前結(jié)點(diǎn)的左子樹,以同樣的步驟遍歷左子樹中的結(jié)點(diǎn); 遍歷完當(dāng)前結(jié)點(diǎn)的左子樹后,再進(jìn)入它的右子樹,以同樣的步驟遍歷右子樹中的結(jié)點(diǎn); 先序遍歷這棵二叉樹的過

    2024年02月04日
    瀏覽(23)
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)初階(10)----二叉樹的實(shí)現(xiàn)

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)初階(10)----二叉樹的實(shí)現(xiàn)

    · CSDN的uu們,大家好。這里是C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)的第十講。 · 目標(biāo):前路坎坷,披荊斬棘,扶搖直上。 · 博客主頁(yè):?@姬如祎 · 收錄專欄:?數(shù)據(jù)結(jié)構(gòu)與算法 ? ? 目錄 1.?函數(shù)接口一覽 2.?函數(shù)接口的實(shí)現(xiàn) 2.1 BTNode* BuyNode(BTDataType x)?的實(shí)現(xiàn) 2.2?BTNode* CreateTree()?的實(shí)現(xiàn) ?2.3?void

    2023年04月08日
    瀏覽(26)
  • 【數(shù)據(jù)結(jié)構(gòu)】二叉樹的前中后序遍歷(C語(yǔ)言)

    【數(shù)據(jù)結(jié)構(gòu)】二叉樹的前中后序遍歷(C語(yǔ)言)

    [二叉樹] 顧名思義就是有 兩個(gè)分支節(jié)點(diǎn)的樹,不僅如此,除了葉子外的所有節(jié)點(diǎn)都具有兩個(gè)分支節(jié)點(diǎn); 由于結(jié)構(gòu)像一棵倒立的樹,顧名思義為二叉樹 ; 如下圖所示,該圖即為一棵 野生的二叉樹 ; 既然二叉樹為樹,固然有著和樹一樣的部分( 葉子、根、分支… ) 這些也成為

    2024年02月17日
    瀏覽(26)
  • 二叉樹的基本操作-C語(yǔ)言實(shí)現(xiàn)-數(shù)據(jù)結(jié)構(gòu)作業(yè)

    二叉樹的基本操作-C語(yǔ)言實(shí)現(xiàn)-數(shù)據(jù)結(jié)構(gòu)作業(yè)

    目錄 ?(1)二叉樹的創(chuàng)建; (2)二叉樹的先序、中序和后序遍歷輸出; (3)輸出二叉樹的葉子節(jié)點(diǎn)和度為2的節(jié)點(diǎn)的數(shù)量; (4)輸出二叉樹的深度; (5)將二叉樹所有節(jié)點(diǎn)的左右子樹互換(左子樹變右子樹,右子樹變左子樹); (6)參考書上,二叉樹按層次輸出(一行輸出一層); (7)刪除二

    2024年02月04日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告,二叉樹的基本操作(C語(yǔ)言)

    數(shù)據(jù)結(jié)構(gòu)實(shí)驗(yàn)報(bào)告,二叉樹的基本操作(C語(yǔ)言)

    作者:命運(yùn)之光 專欄:數(shù)據(jù)結(jié)構(gòu) 實(shí)驗(yàn)六 二叉樹的基本操作 實(shí)驗(yàn)環(huán)境:Visual C++或Dev C++ 實(shí)驗(yàn)?zāi)康模?1、掌握二叉樹創(chuàng)建; 2、掌握二叉樹的遍歷及常用算法。 實(shí)驗(yàn)內(nèi)容: 通過完全前序序列創(chuàng)建一棵二叉樹,完成如下功能: 1)輸出二叉樹的前序遍歷序列; 2)輸出二叉樹的中序遍

    2024年02月09日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包