自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

數(shù)據(jù)結(jié)構(gòu)中二叉樹的基本操作

開發(fā) 架構(gòu)
筆者近日受人所托,搞了點二叉樹的程序,順便回顧了下二叉樹的一些基本知識,特此總結(jié)。

二叉樹的基本操作,可能包括:

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

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

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

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

 

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

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

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

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

1-轉(zhuǎn)化方法

分為幾個步驟:

(1)準備原始數(shù)組

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

(3)創(chuàng)建二叉樹節(jié)點;

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

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

(6)確實二叉樹根節(jié)點;

主要代碼:

(1)準備原始數(shù)組

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

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

  1. //開始獲得數(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)建二叉樹節(jié)點 

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

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

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

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

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

(6)確實二叉樹根節(jié)點

  1. pBiTree=vecPBiTree[0]; 

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

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

完整程序,請見附件文件。

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

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

原文鏈接:http://www.cnblogs.com/vbspine/archive/2013/01/30/bitree.html

 

【編輯推薦】

  1. C# 4.0新特性dynamic作用淺析
  2. Visual C# 2010新特性之dynamic類型
  3. C#實例講解二叉樹原理與實現(xiàn)

 

責(zé)任編輯:彭凡 來源: 博客園
相關(guān)推薦

2021-04-19 07:47:42

數(shù)據(jù)結(jié)構(gòu)二叉樹Tree

2021-04-20 08:37:14

數(shù)據(jù)結(jié)構(gòu)二叉樹

2021-04-28 20:12:27

數(shù)據(jù)結(jié)構(gòu)創(chuàng)建

2020-11-02 09:15:47

算法與數(shù)據(jù)結(jié)構(gòu)

2021-01-07 08:12:47

數(shù)據(jù)結(jié)構(gòu)二叉樹

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-04-01 10:34:18

Java編程數(shù)據(jù)結(jié)構(gòu)算法

2021-03-19 10:25:12

Java數(shù)據(jù)結(jié)構(gòu)算法

2020-09-23 18:25:40

算法二叉樹多叉樹

2018-03-15 08:31:57

二叉樹存儲結(jié)構(gòu)

2021-03-22 09:00:22

Java數(shù)據(jù)結(jié)構(gòu)算法

2019-08-22 09:22:44

數(shù)據(jù)結(jié)構(gòu)二叉搜索樹

2022-10-26 23:58:02

二叉樹數(shù)組算法

2021-03-17 08:19:22

二叉樹LeetCode

2013-07-15 16:35:55

二叉樹迭代器

2021-08-27 11:36:44

二叉樹回溯節(jié)點

2021-09-29 10:19:00

算法平衡二叉樹

2021-10-12 09:25:11

二叉樹樹形結(jié)構(gòu)

2021-05-06 17:46:30

二叉樹數(shù)據(jù)結(jié)構(gòu)

2021-09-15 07:56:32

二叉樹層次遍歷
點贊
收藏

51CTO技術(shù)棧公眾號