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

王道408---數(shù)據(jù)結(jié)構(gòu)--用數(shù)組實(shí)現(xiàn)二叉樹--并查集及其優(yōu)化代碼

這篇具有很好參考價(jià)值的文章主要介紹了王道408---數(shù)據(jù)結(jié)構(gòu)--用數(shù)組實(shí)現(xiàn)二叉樹--并查集及其優(yōu)化代碼。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

一、數(shù)組實(shí)現(xiàn)二叉樹(下標(biāo)從0開始)

#include <stdio.h>
typedef struct _TreeNode{
    int data;
    bool IsEmpty;       //結(jié)點(diǎn)是否為空  // 因?yàn)槲覀兊亩鏄洳灰欢ㄊ菨M二叉樹,中間可能有一些節(jié)點(diǎn)不存在 // 值為1代表空
}TreeNode;


// 初始化
void InitTreeNode(TreeNode t[],int len){
    for(int i=0;i<len;i++)
        t[i].IsEmpty = 1;
}


bool IsEmpty(TreeNode t[],int len,int idx){
    if(idx >= len || idx < 0) return 1;         // 修改為0
    
    return t[idx].IsEmpty;
}

// father = (child-1)/2   or  father = child/2 - 1
int findFather(TreeNode t[],int len,int idx){
    if(idx == 0) return -1;         //特判根節(jié)點(diǎn)沒(méi)有父節(jié)點(diǎn)      // 特判也修改為0
    int fatheridx = (idx-1) / 2;
    if(IsEmpty(t,len,fatheridx)) return -1;
    return fatheridx;
}

// lchild = father*2 + 1
int findLchild(TreeNode t[],int len,int idx){
    int lchild = idx*2 + 1;
    if(IsEmpty(t,len,lchild)) return -1;
    return lchild;
}

// rchild = father*2+2
int findRchild(TreeNode t[],int len,int idx){
    int rchild = idx*2 + 2;
    if(IsEmpty(t,len,rchild)) return -1;
    return rchild; 
}

//實(shí)現(xiàn)前序遍歷, 從下表為idx的節(jié)點(diǎn)開始前序遍歷
int PreorderTree(TreeNode t[],int len,int idx){
    if(IsEmpty(t,len,idx)) return 0;
    printf("%d\n",t[idx].data);
    PreorderTree(t,len,findLchild(t,len,idx));
    PreorderTree(t,len,findRchild(t,len,idx));
    return 0;
}

int InorderTree(TreeNode t[],int len,int idx){
    if(IsEmpty(t,len,idx)) return 0;
    InorderTree(t,len,findLchild(t,len,idx));
    printf("%d\n",t[idx].data);
    InorderTree(t,len,findRchild(t,len,idx));
    return 0;
}
int PostorderTree(TreeNode t[],int len,int idx){
    if(IsEmpty(t,len,idx)) return 0;
    PostorderTree(t,len,findLchild(t,len,idx));
    PostorderTree(t,len,findRchild(t,len,idx));
    printf("%d\n",t[idx].data);
    return 0;
}


int main(){
    TreeNode Td[100];            // 這里的二叉樹節(jié)點(diǎn)要從0開始
    int fatheridx;
    int testLen = 7;          // IsEmpty 的判斷是 >=Len 所以這里加一個(gè)1
    for(int i=0;i<=testLen;i++){
        Td[i].data = i+1;
        Td[i].IsEmpty = 0;
    }
    PreorderTree(Td,testLen,0);
    // InorderTree(Td,testLen,0);
    // PostorderTree(Td,testLen,0);
    return 0;
}

二、數(shù)組實(shí)現(xiàn)二叉樹(下標(biāo)從1開始)

#include <stdio.h>
typedef struct _TreeNode{
    int data;
    bool IsEmpty;       //結(jié)點(diǎn)是否為空  // 因?yàn)槲覀兊亩鏄洳灰欢ㄊ菨M二叉樹,中間可能有一些節(jié)點(diǎn)不存在 // 值為1代表空
}TreeNode;


// 初始化
void InitTreeNode(TreeNode t[],int len){
    for(int i=0;i<len;i++)
        t[i].IsEmpty = 1;
}


bool IsEmpty(TreeNode t[],int len,int idx){
    if(idx >= len || idx < 1) return 1;
    
    return t[idx].IsEmpty;
}

// father = child / 2
int findFather(TreeNode t[],int len,int idx){
    // if(idx == 1) return -1;         //特判根節(jié)點(diǎn)沒(méi)有父節(jié)點(diǎn) ,不加也沒(méi)事,但下表從0開始的時(shí)候必須加
    int fatheridx = idx / 2;
    if(IsEmpty(t,len,fatheridx)) return -1;
    return fatheridx;
}

// lchild = father*2
int findLchild(TreeNode t[],int len,int idx){
    int lchild = idx*2;
    if(IsEmpty(t,len,lchild)) return -1;
    return lchild;
}

// rchild = father*2+1
int findRchild(TreeNode t[],int len,int idx){
    int rchild = idx*2+1;
    if(IsEmpty(t,len,rchild)) return -1;
    return rchild; 
}

//實(shí)現(xiàn)前序遍歷, 從下表為idx的節(jié)點(diǎn)開始前序遍歷
int PreorderTree(TreeNode t[],int len,int idx){
    if(IsEmpty(t,len,idx)) return 0;
    printf("%d\n",t[idx].data);
    PreorderTree(t,len,findLchild(t,len,idx));
    PreorderTree(t,len,findRchild(t,len,idx));
    return 0;
}

int InorderTree(TreeNode t[],int len,int idx){
    if(IsEmpty(t,len,idx)) return 0;
    InorderTree(t,len,findLchild(t,len,idx));
    printf("%d\n",t[idx].data);
    InorderTree(t,len,findRchild(t,len,idx));
    return 0;
}
int PostorderTree(TreeNode t[],int len,int idx){
    if(IsEmpty(t,len,idx)) return 0;
    PostorderTree(t,len,findLchild(t,len,idx));
    PostorderTree(t,len,findRchild(t,len,idx));
    printf("%d\n",t[idx].data);
    return 0;
}


int main(){
    TreeNode Td[100];            // 這里的二叉樹節(jié)點(diǎn)要從一開始
    int fatheridx;
    int testLen = 7+1;          // IsEmpty 的判斷是 >=Len 所以這里加一個(gè)1
    for(int i=1;i<=testLen;i++){
        Td[i].data = i;
        Td[i].IsEmpty = 0;
    }
    PreorderTree(Td,testLen,1);
    // InorderTree(Td,testLen,1);
    // PostorderTree(Td,testLen,1);
    return 0;
}

三、并查集及其優(yōu)化思路

#include <stdio.h>
#define MAXSIZE 50
int UFSets[MAXSIZE];

void InitUFSets(int S[]){
    for(int i=0;i<MAXSIZE;i++){
        S[i] = -1;
    }
}

int find(int S[],int x){
    if(S[x] == -1) return x;           // -1說(shuō)明到底了
    return find(S,S[x]);
}

int pathCompFind(int S[],int x){         // 路徑壓縮策略優(yōu)化Find 操作
    if(S[x] >= 0){
        S[x] = find(S,S[x]); 
        return S[x];
    }
    return x;
}


bool UnionElem(int S[],int elem1,int elem2){    //王道書上是直接合并的root,而不是元素成員
    int first = find(S,elem1);
    int second = find(S,elem2);
    if(first != second){
        printf("%d -- %d\n",first,second);
        S[second] = first;
        return 1;
    }
    return 0;
}

bool UnionRoot(int S[],int Root1,int Root2){
    if(Root1 == Root2) return 0;    //比較兩個(gè)根是否來(lái)自同一集合
    S[Root2] = Root1;               // 將根Root2連接到Root1上
    return 1;
}

bool optUnionRoot(int S[],int Root1,int Root2){
    if(Root1 == Root2) return 0;
    if(S[Root2] > S[Root1]){   // Root2 結(jié)點(diǎn)數(shù)更少         // 因?yàn)槌跏蓟臅r(shí)候S的值全為 -1  所以 若S[Root1]與S[Root2]相加后為更小的負(fù)數(shù)
                                                            //較小的樹,樹較大,這也是為什么 S[Root1] >= S[Root2]時(shí) 卻把Root2合并到Root1中的原因
        S[Root1] += S[Root2];       // 累加節(jié)點(diǎn)個(gè)數(shù)
        S[Root2] = Root1;
    }else{
        S[Root2] += S[Root1];
        S[Root1] = Root2;
    }
    return 1;
}

void debug(){
    for(int i=0;i<MAXSIZE;i++){
        printf("%d ",UFSets[i]);
    }
    puts("");
}

int main(){
    InitUFSets(UFSets);
    int arr[100] = {0,1,2,3,4,5,6,7,8,9};
    for(int i=0;i<=10;i++){
        UnionElem(UFSets,arr[i*2],arr[i*2+1]);
        // 0 -- 1
        // 2 -- 3
        // 4 -- 5
        // 6 -- 7
        // 8 -- 9
    }
    UnionElem(UFSets,1,3);
    UnionElem(UFSets,5,7);
    // 0 -- 1
    // 2 -- 3
    // 4 -- 5
    // 6 -- 7
    // 8 -- 9
    // 0 -- 2
    // 4 -- 6

    UnionElem(UFSets,1,6);
    UnionElem(UFSets,2,7);
    // debug();



    return 0;
}

?文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-631037.html

?

到了這里,關(guān)于王道408---數(shù)據(jù)結(jié)構(gòu)--用數(shù)組實(shí)現(xiàn)二叉樹--并查集及其優(yōu)化代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(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)文章

  • 一篇學(xué)完:王道考研408數(shù)據(jù)結(jié)構(gòu)(全)

    一篇學(xué)完:王道考研408數(shù)據(jù)結(jié)構(gòu)(全)

    PDF版本附在 ?lengyueling.cn?對(duì)應(yīng) 文章結(jié)尾,歡迎下載訪問(wèn)交流 數(shù)據(jù)結(jié)構(gòu)在學(xué)什么 如何用程序代碼把現(xiàn)實(shí)世界的問(wèn)題信息化 如何用計(jì)算機(jī)高效地處理這些信息從而創(chuàng)造價(jià)值 數(shù)據(jù)結(jié)構(gòu)的基本概念 什么是數(shù)據(jù): 數(shù)據(jù)是信息的載體,是描述客觀事物屬性的數(shù)、字符及所有能輸入到

    2023年04月08日
    瀏覽(25)
  • 【數(shù)據(jù)結(jié)構(gòu)】【王道408】——PPT截圖與思維導(dǎo)圖

    【數(shù)據(jù)結(jié)構(gòu)】【王道408】——PPT截圖與思維導(dǎo)圖

    自用視頻PPT截圖 視頻網(wǎng)址王道B站鏈接 23考研 408新增考點(diǎn): 并查集,紅黑樹 2023年408真題數(shù)據(jù)結(jié)構(gòu)篇 408考綱解讀 考綱變化 希爾排序 冒泡排序 快速排序 簡(jiǎn)單排序算法 堆排序

    2024年02月15日
    瀏覽(25)
  • 數(shù)據(jù)結(jié)構(gòu)之二叉樹的數(shù)組表示

    若某節(jié)點(diǎn)的索引為 i ,則該節(jié)點(diǎn)的左子節(jié)點(diǎn)的索引為 2i+1 ,右子節(jié)點(diǎn)的索引為 2i+2 給定某節(jié)點(diǎn),獲取它的左右字節(jié)點(diǎn),父節(jié)點(diǎn) 獲取前序遍歷,中序遍歷,后序遍歷,層序遍歷

    2024年01月18日
    瀏覽(27)
  • Java常見的數(shù)據(jù)結(jié)構(gòu):棧、隊(duì)列、數(shù)組、鏈表、二叉樹、二叉查找樹、平衡二叉樹、紅黑樹

    Java常見的數(shù)據(jù)結(jié)構(gòu):棧、隊(duì)列、數(shù)組、鏈表、二叉樹、二叉查找樹、平衡二叉樹、紅黑樹

    數(shù)據(jù)結(jié)構(gòu)是計(jì)算機(jī)底層存儲(chǔ)、組織數(shù)據(jù)的方式。是指數(shù)據(jù)相互之間是以什么方式排列在一起的。 通常情況下,精心選擇的數(shù)據(jù)結(jié)構(gòu)可以帶來(lái)更高的運(yùn)行或者存儲(chǔ)效率 棧 隊(duì)列 數(shù)組 鏈表 二叉樹 二叉查找樹 平衡二叉樹 紅黑樹... 后進(jìn)先出,先進(jìn)后出 數(shù)據(jù)進(jìn)入棧模型的過(guò)程稱為

    2024年02月07日
    瀏覽(29)
  • 【23考研】計(jì)算機(jī)408數(shù)據(jù)結(jié)構(gòu)代碼題強(qiáng)化階段劃重點(diǎn)(王道書)

    視頻鏈接:【23考研】10分鐘帶你整理408數(shù)據(jù)結(jié)構(gòu)強(qiáng)化階段代碼題復(fù)習(xí)重點(diǎn) 本篇只適合考408的同學(xué),請(qǐng)自主命題的同學(xué)自覺(jué)右上角×掉 因?yàn)橥醯罆鵀榱苏疹欁灾髅}的同學(xué),所以很多算法也給出了代碼實(shí)現(xiàn),實(shí)際上對(duì)于考408的同學(xué),很多代碼是不需要掌握的,畢竟408的代碼題沒(méi)

    2024年02月15日
    瀏覽(48)
  • 【數(shù)據(jù)結(jié)構(gòu)大全】你想要的都有,數(shù)組、鏈表、堆棧、二叉樹、紅黑樹、B樹、圖......

    【數(shù)據(jù)結(jié)構(gòu)大全】你想要的都有,數(shù)組、鏈表、堆棧、二叉樹、紅黑樹、B樹、圖......

    作者簡(jiǎn)介: 目錄 1.概述 2.線性結(jié)構(gòu) 3.時(shí)間復(fù)雜度 4.查找算法 5.樹 6.圖 博主之前寫過(guò)一個(gè)完整的關(guān)于數(shù)據(jù)結(jié)構(gòu)的系列文章,一共十三篇,內(nèi)容包含,數(shù)組、鏈表、堆棧、隊(duì)列、時(shí)間復(fù)雜度、順序查找、二分查找、二叉樹、二叉搜索樹、平衡二叉樹、紅黑樹、B樹、B+樹、大頂堆

    2024年02月10日
    瀏覽(18)
  • 【數(shù)據(jù)結(jié)構(gòu)和算法】--- 二叉樹(3)--二叉樹鏈?zhǔn)浇Y(jié)構(gòu)的實(shí)現(xiàn)(1)

    【數(shù)據(jù)結(jié)構(gòu)和算法】--- 二叉樹(3)--二叉樹鏈?zhǔn)浇Y(jié)構(gòu)的實(shí)現(xiàn)(1)

    在學(xué)習(xí)二叉樹的基本操作前,需先要?jiǎng)?chuàng)建一棵二叉樹,然后才能學(xué)習(xí)其相關(guān)的基本操作。由于現(xiàn)在大家對(duì)二叉樹結(jié)構(gòu)掌握還不夠深入,且為了方便后面的介紹,此處手動(dòng)快速創(chuàng)建一棵簡(jiǎn)單的二叉樹,快速進(jìn)入二叉樹操作學(xué)習(xí),等二叉樹結(jié)構(gòu)了解的差不多時(shí),我們反過(guò)頭再來(lái)研

    2024年01月25日
    瀏覽(28)
  • 【數(shù)據(jù)結(jié)構(gòu)】樹、二叉樹的概念和二叉樹的順序結(jié)構(gòu)及實(shí)現(xiàn)

    【數(shù)據(jù)結(jié)構(gòu)】樹、二叉樹的概念和二叉樹的順序結(jié)構(gòu)及實(shí)現(xiàn)

    之前我們學(xué)習(xí)了順序表、鏈表以及棧和隊(duì)列這些數(shù)據(jù)結(jié)構(gòu),但這些數(shù)據(jù)結(jié)構(gòu)都是線性的(一對(duì)一)。接下來(lái)要學(xué)習(xí) 非線性的數(shù)據(jù)結(jié)構(gòu)——樹(二叉樹) ,相比前面的,樹的結(jié)構(gòu)更加復(fù)雜,話不多說(shuō),直接進(jìn)入正題吧。 樹是一種 非線性的數(shù)據(jù)結(jié)構(gòu) ,它是 一對(duì)多(也有可能是

    2024年02月07日
    瀏覽(27)
  • 【數(shù)據(jù)結(jié)構(gòu)—二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)實(shí)現(xiàn)】

    【數(shù)據(jù)結(jié)構(gòu)—二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)實(shí)現(xiàn)】

    提示:文章寫完后,目錄可以自動(dòng)生成,如何生成可參考右邊的幫助文檔 文章目錄 前言 一、二叉樹的存儲(chǔ)結(jié)構(gòu) 二、二叉樹鏈?zhǔn)浇Y(jié)構(gòu)的實(shí)現(xiàn) 2.1手動(dòng)構(gòu)建一課樹 2.2二叉樹的遍歷 三、二叉樹鏈?zhǔn)浇Y(jié)構(gòu)的實(shí)現(xiàn) 3.1前序遍歷(遞歸) 3.2中序遍歷(遞歸) 3.3后序遍歷(遞歸) 3.4層序遍歷(非遞

    2024年02月03日
    瀏覽(24)
  • 【數(shù)據(jù)結(jié)構(gòu) —— 二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)實(shí)現(xiàn)】

    【數(shù)據(jù)結(jié)構(gòu) —— 二叉樹的鏈?zhǔn)浇Y(jié)構(gòu)實(shí)現(xiàn)】

    樹是一種非線性的數(shù)據(jù)結(jié)構(gòu),它是由n(n=0)個(gè)有限結(jié)點(diǎn)組成一個(gè)具有層次關(guān)系的集合。 把它叫做樹是因?yàn)樗雌饋?lái)像一棵倒掛的樹,也就是說(shuō)它是根朝上,而葉朝下的。 1.有一個(gè) 特殊的結(jié)點(diǎn),稱為根結(jié)點(diǎn) ,根節(jié)點(diǎn)沒(méi)有前驅(qū)結(jié)點(diǎn) 2.除根節(jié)點(diǎn)外, 其余結(jié)點(diǎn)被分成M(M0)個(gè)互不相交

    2024年02月05日
    瀏覽(27)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包