欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言 數(shù)據(jù)結(jié)構(gòu)之中序二叉樹實(shí)例詳解

 更新時(shí)間:2017年01月13日 15:07:17   投稿:lqh  
這篇文章主要介紹了C語言 數(shù)據(jù)結(jié)構(gòu)之中序二叉樹實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下

C語言數(shù)據(jù)結(jié)構(gòu) 中序二叉樹

前言:

線索二叉樹主要是為了解決查找結(jié)點(diǎn)的線性前驅(qū)與后繼不方便的難題。它只增加了兩個(gè)標(biāo)志性域,就可以充分利用沒有左或右孩子的結(jié)點(diǎn)的左右孩子的存儲(chǔ)空間來存放該結(jié)點(diǎn)的線性前驅(qū)結(jié)點(diǎn)與線性后繼結(jié)點(diǎn)。兩個(gè)標(biāo)志性域所占用的空間是極少的,所有充分利用了二叉鏈表中空閑存的儲(chǔ)空間。

   要實(shí)現(xiàn)線索二叉樹,就必須定義二叉鏈表結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)如下(定義請(qǐng)看代碼):

left

leftTag

data

rightTag

right

說明:

1.       leftTag=false時(shí),表示left指向該結(jié)點(diǎn)的左孩子;

2.       leftTag=true時(shí),表示left指向該結(jié)點(diǎn)的線性前驅(qū)結(jié)點(diǎn);

3.       rightTag=false時(shí),表示right指向該結(jié)點(diǎn)的右孩子;

4.       rightTag=true時(shí),表示right指向該結(jié)點(diǎn)的線性后繼結(jié)點(diǎn);

     以二叉鏈表結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)所構(gòu)成的二叉鏈表作為二叉樹的存儲(chǔ)結(jié)構(gòu),叫做線索二叉鏈表;指向結(jié)點(diǎn)的線性前驅(qū)或者線性后繼結(jié)點(diǎn)的指針叫做線索;加上線索的二叉樹稱為線索二叉樹;對(duì)二叉樹以某種次序遍歷將其變?yōu)榫€索二叉樹的過程叫做線索化。

中序次序線索化二叉樹算法:

  中序次序線索化是指用二叉鏈表結(jié)點(diǎn)數(shù)據(jù)結(jié)構(gòu)建立二叉樹的二叉鏈表,然后按照中序遍歷的方法訪問結(jié)點(diǎn)時(shí)建立線索;(具體看代碼)

檢索中序二叉樹某結(jié)點(diǎn)的線性前驅(qū)結(jié)點(diǎn)的算法:

1.       如果該結(jié)點(diǎn)的leftTag=true,那么left就是它的線性前驅(qū);

2.       如果該結(jié)點(diǎn)的leftTag=false,那么該結(jié)點(diǎn)左子樹最右邊的尾結(jié)點(diǎn)就是它的線性前驅(qū)點(diǎn);

(具體請(qǐng)看代碼)

檢索中序二叉樹某結(jié)點(diǎn)的線性后繼結(jié)點(diǎn)和算法:

1.       如果該結(jié)點(diǎn)的right=true,那么right就是它的線性后繼結(jié)點(diǎn);

2.       如果該結(jié)點(diǎn)的right=false,那么該結(jié)點(diǎn)右子樹最左邊的尾結(jié)點(diǎn)就是它的線性后繼結(jié)點(diǎn)

(具體請(qǐng)看代碼)


圖:后繼線索


圖:前驅(qū)線索

 節(jié)點(diǎn)定義:

struct Node 
{ 
  int data; 
  bool leftTag; 
  bool rightTag; 
  Node* left; 
  Node* right; 
  Node(int _data):data(_data),left(0),right(0),leftTag(false),rightTag(false){} 
}; 

類定義:

class BinaryTree 
{ 
private: 
  Node* root; 
private: 
  Node* head; 
  Node* pre; 
  void makeThread(Node* node); 
public: 
  void buildThread(); 
  void traverseBySuccessor(); 
  void traverseByPredecessor(); 
 
// helper methods 
private: 
  static inline bool visit(Node* T) 
  { 
    if (T) 
    { 
      printf("data:%c, left:%c, right:%c\n", 
        (char)T->data, 
        (T->left!=0) ? (char)T->left->data : '#', 
        (T->right!=0) ? (char)T->right->data : '#'); 
      return true; 
    } 
    else return false; 
  } 
}; 

方法定義:

void BinaryTree::makeThread(Node* node) 
{ 
  if (node!=NULL) 
  { 
    makeThread(node->left); 
    if (pre!= NULL) 
    { 
      if (pre->right==NULL) // 如果前驅(qū)節(jié)點(diǎn)的右子樹為空, 那么把前驅(qū)節(jié)點(diǎn)的右子樹用作線索 
      { 
        pre->rightTag = true;  
        pre->right = node; 
      } 
      else pre->rightTag = false; 
    } 
    if (node->left==NULL) // 如果當(dāng)前結(jié)點(diǎn)的左子樹為空, 那么把當(dāng)前結(jié)點(diǎn)的左子樹用作線索 
    { 
      node->leftTag = true; 
      node->left = pre; 
    } 
    else node->leftTag = false; 
    pre = node; 
    makeThread(node->right); 
  } 
} 
 
void BinaryTree::traverseBySuccessor() 
{ 
  Node* p = head->left; //first find the root node 
  // 親測(cè)表明 如果不使用head啞節(jié)點(diǎn) 就要設(shè)三道卡, 防止p訪問到NULL,  
  // 分別在主while處, 第二個(gè)visit處和下面的p=p->right處 
  while (p!=head) 
  { 
    while (!p->leftTag) 
      p = p->left; 
    visit(p); 
 
    while (p->rightTag && p->right!=head) 
    { 
      p = p->right; 
      visit(p); 
    } 
    p = p->right; 
  } 
  cout<<endl; 
} 
 
void BinaryTree::traverseByPredecessor() 
{ 
  Node* p = head->left; //first find the root node 
  while (p!=head) 
  { 
    while (!p->rightTag) 
      p = p->right; 
    visit(p); 
    if (p!=NULL) 
    { 
      while (p->leftTag && p->left!=head) 
      { 
        p = p->left; 
        visit(p); 
      } 
      p = p->left; 
    } 
  } 
  cout<<endl; 
} 
 
void BinaryTree::buildThread() 
{ 
  pre = NULL; 
  head = new Node('@'); 
  head->left = root; 
  head->right = head; 
  makeThread(root); 
  // 經(jīng)過了makeThread過程之后, pre必然指向中序遍歷最晚的結(jié)點(diǎn). 
  // 把pre的右子樹指向head, 就構(gòu)成了一個(gè)雙向循環(huán)鏈表 
  // 
  pre->rightTag = 1; 
  pre->right = head; 
  pre = NULL; 
  Node* p = root; 
  /* 
   * 在建立前驅(qū)線索的時(shí)候,最左邊的結(jié)點(diǎn)沒有和head結(jié)點(diǎn)連接。要在這里補(bǔ)上 
   */ 
  while (p->left!=NULL) 
    p = p->left; 
  p->left = head; 
} 

感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!

相關(guān)文章

  • C++實(shí)現(xiàn)簡單的學(xué)生成績管理系統(tǒng)

    C++實(shí)現(xiàn)簡單的學(xué)生成績管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)簡單的學(xué)生成績管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • C++之string類對(duì)象的容量操作詳解

    C++之string類對(duì)象的容量操作詳解

    通過在網(wǎng)站上的資料搜集,得到了很多關(guān)于string類對(duì)象的容量操作,通過對(duì)這些資料的整理和加入一些自己的代碼,希望能夠給你帶來幫助
    2021-08-08
  • C++實(shí)現(xiàn)鬧鐘程序的方法

    C++實(shí)現(xiàn)鬧鐘程序的方法

    這篇文章主要介紹了C++實(shí)現(xiàn)鬧鐘程序的方法,比較實(shí)用的功能,需要的朋友可以參考下
    2014-08-08
  • C++中如何將數(shù)據(jù)保存為CSV文件

    C++中如何將數(shù)據(jù)保存為CSV文件

    這篇文章主要介紹了C++中如何將數(shù)據(jù)保存為CSV文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++基于prim實(shí)現(xiàn)迷宮生成

    C++基于prim實(shí)現(xiàn)迷宮生成

    這篇文章主要為大家詳細(xì)介紹了C++基于prim實(shí)現(xiàn)迷宮生成,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • C++11并發(fā)編程關(guān)于原子操作atomic的代碼示例

    C++11并發(fā)編程關(guān)于原子操作atomic的代碼示例

    今天小編就為大家分享一篇關(guān)于C++11并發(fā)編程關(guān)于原子操作atomic的代碼示例,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • C語言職工信息管理系統(tǒng)源碼

    C語言職工信息管理系統(tǒng)源碼

    這篇文章主要為大家詳細(xì)介紹了C語言職工信息管理系統(tǒng)源碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++性能剖析教程之循環(huán)展開

    C++性能剖析教程之循環(huán)展開

    這篇文章主要給大家介紹了關(guān)于C++性能剖析教程之循環(huán)展開的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-06-06
  • C++編程中的const關(guān)鍵字常見用法總結(jié)

    C++編程中的const關(guān)鍵字常見用法總結(jié)

    這篇文章主要介紹了C++編程中的const關(guān)鍵字常見用法總結(jié),const關(guān)鍵字的使用是C++入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下
    2015-11-11
  • C++實(shí)現(xiàn)的歸并排序算法詳解

    C++實(shí)現(xiàn)的歸并排序算法詳解

    這篇文章主要介紹了C++實(shí)現(xiàn)的歸并排序算法,結(jié)合實(shí)例形式詳細(xì)分析了歸并排序算法的原理、實(shí)現(xiàn)步驟、操作技巧與使用方法,需要的朋友可以參考下
    2017-05-05

最新評(píng)論