日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
數(shù)據(jù)結(jié)構(gòu)中二叉樹(shù)的基本操作

二叉樹(shù)的基本操作,可能包括:

濱江網(wǎng)站建設(shè)公司成都創(chuàng)新互聯(lián),濱江網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為濱江1000+提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\外貿(mào)營(yíng)銷(xiāo)網(wǎng)站建設(shè)要多少錢(qián),請(qǐng)找那個(gè)售后服務(wù)好的濱江做網(wǎng)站的公司定做!

創(chuàng)建,遍歷,轉(zhuǎn)化,復(fù)制,刪除等。

遍歷:前中后三種順序的遍歷,已經(jīng)是各數(shù)據(jù)結(jié)構(gòu)與算法教程的最基礎(chǔ)內(nèi)容,在此不重復(fù)。

創(chuàng)建:大多數(shù)據(jù)結(jié)構(gòu)教程當(dāng)中的二叉樹(shù)創(chuàng)建程序,都是采用的遞歸方式,遞歸方式創(chuàng)建的二叉樹(shù)與遍歷的過(guò)程相似,所創(chuàng)建的二叉樹(shù),也是采用左右子節(jié)點(diǎn)方式,后續(xù)進(jìn)行遍歷操作十分方便。

轉(zhuǎn)化:直覺(jué)上,最簡(jiǎn)單的二叉樹(shù)存儲(chǔ)方式其實(shí)是如下圖的數(shù)組:

*此圖出自某高校數(shù)據(jù)結(jié)構(gòu)ppt,但實(shí)在難以查證是哪個(gè)學(xué)校,無(wú)法直接感謝,請(qǐng)諒解。

首先,提供個(gè)滿二叉樹(shù)大小的數(shù)組,然后其中數(shù)值按完全二叉樹(shù)存儲(chǔ)。

顯然,此種順序存儲(chǔ)方法:第i號(hào)(這里編號(hào)指對(duì)應(yīng)的完全二叉樹(shù)的位序)結(jié)點(diǎn)的左右孩子一定保存在第2i及2i+1號(hào)單元中。

故此,為兼顧存儲(chǔ)的直觀與遍歷等操作的方便,從順序數(shù)組向左右子節(jié)點(diǎn)存儲(chǔ)方式的轉(zhuǎn)化也就十分重要。

1-轉(zhuǎn)化方法

分為幾個(gè)步驟:

(1)準(zhǔn)備原始數(shù)組

(2)分析數(shù)組中的有效值,對(duì)應(yīng)二叉樹(shù)節(jié)點(diǎn)非空;

(3)創(chuàng)建二叉樹(shù)節(jié)點(diǎn);

(4)計(jì)算除最后一層子節(jié)點(diǎn)外,構(gòu)造節(jié)點(diǎn)間父子關(guān)系時(shí)的循環(huán)次數(shù);

(5)構(gòu)造二叉樹(shù)節(jié)點(diǎn)間的父子關(guān)系;

(6)確實(shí)二叉樹(shù)根節(jié)點(diǎn);

主要代碼:

(1)準(zhǔn)備原始數(shù)組

 
 
 
 
  1. //原始數(shù)組
  2.     int intBiTreeInit[ARR_COUNT];
  3.    
  4.     //初始化原始數(shù)組至無(wú)效值
  5.     for(int i=0;i<=ARR_COUNT-1;i++)
  6.         intBiTreeInit[i]=NVALUE;
  7.     //本if條件確保ARR_COUNT是否是的乘方-1
  8.     if(0==(ARR_COUNT & (ARR_COUNT+1)))
  9.     {
  10.         for(int i=0;i<=ARR_COUNT-1;i++)
  11.             intBiTreeInit[i]=2*(i+1);
  12.     }
  13.     else
  14.         return RET_ERR;
  15.     //使最后兩數(shù)為無(wú)效值
  16.     intBiTreeInit[ARR_COUNT-1]=NVALUE;
  17.     intBiTreeInit[ARR_COUNT-2]=NVALUE;

(2)分析數(shù)組中的有效值

 
 
 
 
  1. //開(kāi)始獲得數(shù)組中有效值位置
  2.    int intRel=0;
  3.    int intArr=0;
  4.    for(intArr=0;intArr<=intCount-1;intArr++)
  5.    {
  6.        if(elemArr[intArr]!=elemNValue)
  7.        {
  8.            intRel++;
  9.            vecIntEffPos.push_back(intArr);
  10.        }
  11.        }

(3)創(chuàng)建二叉樹(shù)節(jié)點(diǎn)

  
 
 
 
  1. //數(shù)組中有效值對(duì)應(yīng)創(chuàng)建節(jié)點(diǎn)
  2. //同時(shí)初始化父子節(jié)點(diǎn)為NULL
  3. for(intArr=0;intArr<=intRel-1;intArr++)
  4. {
  5.     pBiTreeTemp=(PBiTreeNode)malloc(sizeof(BiTreeNode));;
  6.     
  7.     if(NULL==pBiTreeTemp)                                //判斷是否有足夠的內(nèi)存空間
  8.     {
  9.         cout<<"Memory alloc failure"<
  10.         return RET_ERR;
  11.     }
  12.     //將有效值賦予節(jié)點(diǎn)
  13.     pBiTreeTemp->BiTreeData=elemArr[vecIntEffPos[intArr]];
  14.     
  15.     //初始化左右子節(jié)點(diǎn)為null,便于后續(xù)的遍歷
  16.     pBiTreeTemp->leftChild=NULL;
  17.     pBiTreeTemp->rightChild=NULL;
  18.     //先存節(jié)點(diǎn)值
  19.     vecPBiTree.push_back(pBiTreeTemp);

(4)計(jì)算除最后一層子節(jié)點(diǎn)外,構(gòu)造節(jié)點(diǎn)間父子關(guān)系時(shí)的循環(huán)次數(shù)

    //生成父子關(guān)系時(shí)最后一層不必遍歷,故理論循環(huán)上限可優(yōu)化

 
 
 
 
  1. int intSubLast=0;
  2.    intSubLast=intCount-(intCount+1)/2;

(5)構(gòu)造二叉樹(shù)節(jié)點(diǎn)間的父子關(guān)系

 
 
 
 
  1. for(intArr=0;intArr<=intSubLast-1;intArr++)
  2. {
  3.     //左右節(jié)點(diǎn)若存儲(chǔ)有效值則同時(shí)創(chuàng)建父子關(guān)系
  4.     if(elemArr[intArr*2+1]!=elemNValue)
  5.         vecPBiTree[intArr]->leftChild=vecPBiTree[intArr*2+1];
  6.         
  7.     if(elemArr[intArr*2+2]!=elemNValue)
  8.         vecPBiTree[intArr]->rightChild=vecPBiTree[intArr*2+2];

(6)確實(shí)二叉樹(shù)根節(jié)點(diǎn)

  
 
 
 
  1. pBiTree=vecPBiTree[0];

轉(zhuǎn)化為左右子節(jié)點(diǎn)方式存儲(chǔ)后,則各種遍歷操作按大多數(shù)教程的常規(guī)方式處理即可,如前序遍歷函數(shù):

 
 
 
 
  1. int BiTreePreTrace(PBiTreeNode &pBiTree)
  2. {
  3.     //條件為非空樹(shù)
  4.     if(pBiTree)
  5.     {
  6.         cout<<"Node value="<<(pBiTree->BiTreeData)<
  7.         
  8.         BiTreePreTrace(pBiTree->leftChild);    //遍歷左子樹(shù)
  9.         BiTreePreTrace(pBiTree->rightChild);    //遍歷右子樹(shù)
  10.     }
  11.     return RET_OK;
  12. }

完整程序,請(qǐng)見(jiàn)附件文件。

 http://files.cnblogs.com/vbspine/cnsDSExec.rar

*上述程序在Windows7x64,VS2008環(huán)境編譯運(yùn)行通過(guò)


本文題目:數(shù)據(jù)結(jié)構(gòu)中二叉樹(shù)的基本操作
URL鏈接:http://www.5511xx.com/article/cdhddih.html