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

二叉樹的定義以及存儲(chǔ)結(jié)構(gòu)

存儲(chǔ) 存儲(chǔ)軟件
二叉樹是n個(gè)結(jié)點(diǎn)的有限集合,該集合或者為空集,或者由一個(gè)根結(jié)點(diǎn)和兩顆互不相交的、分別稱為根結(jié)點(diǎn)的左子樹和右子樹的二叉樹組成。

 二叉樹的定義:

二叉樹是n個(gè)結(jié)點(diǎn)的有限集合,該集合或者為空集,或者由一個(gè)根結(jié)點(diǎn)和兩顆互不相交的、分別稱為根結(jié)點(diǎn)的左子樹和右子樹的二叉樹組成。

二叉樹具有五種基本的形態(tài):

  1. 空二叉樹。
  2. 只有一個(gè)根結(jié)點(diǎn)。
  3. 根結(jié)點(diǎn)只有左子樹。
  4. 根結(jié)點(diǎn)只有右子樹。

特殊的二叉樹

  1. 斜樹。
  2. 滿二叉樹。
  3. 完全二叉樹。

[[222529]]

二叉樹的順序存儲(chǔ)結(jié)構(gòu):

二叉樹的順序存儲(chǔ)結(jié)構(gòu)就是用一維數(shù)組存儲(chǔ)二叉樹中的結(jié)點(diǎn),并且結(jié)點(diǎn)的存儲(chǔ)位置,也就是數(shù)組的下標(biāo)要能體現(xiàn)結(jié)點(diǎn)之間的邏輯關(guān)系,比如雙親與孩子的關(guān)系,左右兄弟的關(guān)系。

使用順序存儲(chǔ)結(jié)構(gòu)表現(xiàn)二叉樹的時(shí)候,在其線性結(jié)構(gòu)中,會(huì)存在一些空結(jié)點(diǎn),但是其會(huì)占據(jù)一定的內(nèi)存空間,會(huì)造成存儲(chǔ)空間的浪費(fèi);所以,順序存儲(chǔ)結(jié)構(gòu)一般只用于完全二叉樹。

二叉樹的鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu):

由于二叉樹的每個(gè)結(jié)點(diǎn)最多有兩個(gè)孩子,所以為每個(gè)結(jié)點(diǎn)設(shè)計(jì)一個(gè)數(shù)據(jù)域和兩個(gè)指針域,通常將其稱之為二叉鏈表。

二叉鏈表的結(jié)點(diǎn)結(jié)構(gòu)定義代碼:

  1. typedef char TElemType; 
  2. typedef struct BinaryTreeNode{ 
  3.     TElemType data;     
  4.     //lchild指向左結(jié)點(diǎn)的指針 
  5.     //rchild指向右結(jié)點(diǎn)的指針 
  6.     struct BinaryTreeNode *lchild,*rchild; 
  7. }BinaryTreeNode,*BinaryTree; 

二叉樹的遍歷

二叉樹的遍歷是指從根結(jié)點(diǎn)出發(fā),按照某種次序一次訪問(wèn)二叉樹中所有結(jié)點(diǎn),使得每個(gè)結(jié)點(diǎn)被訪問(wèn)一次且僅被訪問(wèn)一次。

二叉樹的遍歷方法:

  1. 前序遍歷
  2. 中序遍歷
  3. 后序遍歷

1.首先創(chuàng)建一棵二叉樹

構(gòu)建二叉樹,向結(jié)點(diǎn)的數(shù)據(jù)域中添加字符。

  1. void CreateBinaryTree(BinaryTree *T){ 
  2.     TElemType ch;     
  3.     cin>>ch;     
  4.     if (ch=='$'){ 
  5.         *T=NULL
  6.     }else
  7.         *T=new BinaryTreeNode;         
  8.         if (!*T)return
  9.         (*T)->data=ch; 
  10.         CreateBinaryTree(&(*T)->lchild); 
  11.         CreateBinaryTree(&(*T)->rchild); 
  12.     } 

2.二叉樹的前序遍歷算法

  1. void PreOrderTraverse(BinaryTree T){     
  2. if (T==NULL){         
  3.     cout<<"#"<<"  ";         
  4.         return
  5.     }     
  6.     cout<<T->data<<"  "
  7.     PreOrderTraverse(T->lchild); 
  8.     PreOrderTraverse(T->rchild); 

3.二叉樹的中序遍歷算法

  1. void InOderTraverse(BinaryTree T){     
  2. if(T!=NULL){         
  3.         cout<<"#"<<"  ";         
  4.         return
  5.     } 
  6.     InOderTraverse(T->lchild);     
  7.     cout<<T->data<<"  "
  8.     InOrderTraverse(T->rchild); 

4.二叉樹的后序遍歷算法

  1. void PostOrderTraverse(BinaryTree T){     
  2.     if (T->NULL){         
  3.         cout<<"#"<<"  ";         
  4.         return
  5.     } 
  6.     PostOrderTraverse(T->lchild); 
  7.     PostOrderTraverse(T->rchild);     
  8.     cout<<T->data<<"  "

前序遍歷、中序遍歷和后序遍歷算法的核心算法大致相同,都是利用了函數(shù)遞歸的原理。這里順帶補(bǔ)充一下關(guān)于函數(shù)遞歸調(diào)用的原理:

裴波那契數(shù)列的實(shí)現(xiàn)來(lái)講解函數(shù)的遞歸調(diào)用,假設(shè)存在這樣一個(gè)函數(shù):

使用遞歸實(shí)現(xiàn)裴波那契數(shù)列代碼如下:

  1. int Fibonacci(int i){     
  2.     if (i<2){         
  3.         return i==0?0:1; 
  4.     }     
  5.         return Fibonacci(i-1)+Fibonacci(i-2); 

通過(guò)二叉樹的結(jié)構(gòu)來(lái)分析遞歸調(diào)用的執(zhí)行過(guò)程:(摘自大話數(shù)據(jù)結(jié)構(gòu) P103頁(yè))

主函數(shù)中的測(cè)試代碼如下:

  1. //測(cè)試代碼int main() 
  2.     BinaryTree tree = new BinaryTreeNode;     
  3.     cout << "構(gòu)建一顆由字符構(gòu)成的二叉樹,#代表空" << endl; 
  4.     CreateBinaryTree(&tree);     
  5.     cout << "二叉樹的前序遍歷輸出" << endl; 
  6.     PreOderTraverse(tree);     
  7.     cout << endl;     
  8.     cout << "二叉樹的中序遍歷輸出" << endl; 
  9.     InOderTraverse(tree);     
  10.     cout << endl;     
  11.     cout << "二叉樹的后序遍歷輸出" << endl; 
  12.     PostOderTraverse(tree);     
  13.     cout << endl;     
  14.     return 0; 

輸出如下圖所示:

假設(shè)輸入這樣一個(gè)二叉樹數(shù)據(jù)結(jié)構(gòu):

代表當(dāng)前節(jié)點(diǎn)的數(shù)據(jù)域?yàn)榭?/strong>

ABD#J##EK###CFL###G##

責(zé)任編輯:武曉燕 來(lái)源: 碼碼小蟲
相關(guān)推薦

2020-04-27 07:05:58

二叉樹左子樹右子樹

2021-04-19 07:47:42

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

2021-04-20 08:37:14

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

2020-09-23 18:25:40

算法二叉樹多叉樹

2021-04-28 20:12:27

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

2013-01-30 10:34:02

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

2021-08-27 11:36:44

二叉樹回溯節(jié)點(diǎn)

2021-09-29 10:19:00

算法平衡二叉樹

2022-10-26 23:58:02

二叉樹數(shù)組算法

2021-03-17 08:19:22

二叉樹LeetCode

2013-07-15 16:35:55

二叉樹迭代器

2020-11-02 09:15:47

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

2021-09-15 07:56:32

二叉樹層次遍歷

2021-10-12 09:25:11

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

2021-03-22 08:23:29

LeetCode二叉樹節(jié)點(diǎn)

2023-05-08 15:57:16

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

2021-05-06 17:46:30

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

2021-01-07 08:12:47

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

2020-12-22 08:56:51

JavaScript數(shù)據(jù)結(jié)構(gòu)前端

2021-09-28 06:28:51

二叉樹公共祖先
點(diǎn)贊
收藏

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