最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++基于遞歸算法解決漢諾塔問題與樹的遍歷功能示例

 更新時間:2017年11月07日 11:06:26   作者:侯凱  
這篇文章主要介紹了C++基于遞歸算法解決漢諾塔問題與樹的遍歷功能,簡單描述了遞歸算法的原理,并結合實例形式分析了基于遞歸算法解決漢諾塔問題與數的遍歷相關操作技巧,需要的朋友可以參考下

本文實例講述了C++基于遞歸算法解決漢諾塔問題與樹的遍歷功能。分享給大家供大家參考,具體如下:

遞歸是把問題轉化為規(guī)模縮小的同類問題,然后迭代調用函數(或過程)求得問題的解。遞歸函數就是直接或間接調用自身的函數

遞歸兩要素:遞歸關系遞歸邊界(終止條件),遞歸關系確定了迭代的層次結構,需要深入了解并分解問題;終止條件保證了程序的有窮性。

遞歸的應用有很多,常見的包括:階乘運算、斐波那契數列、漢諾塔、數的遍歷,還有大名鼎鼎的快排等等。理論上,遞歸問題都可以由多層循環(huán)來實現。遞歸的每次調用都會消耗一定的??臻g,效率要稍低于循環(huán)實現,但遞歸使函數更加簡潔,極大地增加了程序的可讀性。這里介紹漢諾塔和樹的遍歷兩種應用。

漢諾塔(hanoi)

有三根相鄰的柱子,標號為A,B,C,A柱子上從下到上按金字塔狀疊放著n個不同大小的圓盤,要把所有盤子一個一個移動到柱子C上,并且每次移動同一根柱子上都不能出現大盤子在小盤子上方。

遞歸規(guī)則:先把a上的n-1個搬到b上,再把a上第n個搬到c,然后把b上的n-1個搬到c上;終止條件是n=0。

/*
 *作者:侯凱
 *說明:目標:把n個盤子從a往c搬
 */
void hanoi(int n, char a,char b,char c)
{
  if(n>0)
  {
    hanoi(n-1,a,c,b);
    cout<<a<<"->"<<c<<endl;
    hanoi(n-1,b,a,c);
  }
}
void main()
{
  hanoi(4,'A','B','C');
}

這樣程序便十分簡潔的實現了看似復雜的功能,下面再看一個經典的問題:

遍歷二叉樹

二叉樹的遍歷是指從根節(jié)點出發(fā),按照某種次序依次訪問二叉樹中的所有結點,使得每個結點被訪問一次且僅被訪問一次。遍歷方法有四種:前序遍歷(先訪問根節(jié)點,然后前序遍歷左子樹,最后前序遍歷右子樹)、中序遍歷(左子樹->根節(jié)點->右子樹)、后序遍歷(左子樹->右子樹->根節(jié)點)和層序遍歷(每一層自左向右,各層自上向下訪問)。

可見前三種遍歷方法的定義就體現了遞歸的思想,算法實現如下:

//前序遍歷
void PreorderTra(BiTree T)
{
  if(T == NULL)
  {
    return;
  }
  printf("%c",T->data);//輸出結點數據,可更改為其他對結點的操作
  PreorderTra(T->lchild);//前序遍歷左子樹
  PreorderTra(T->rchild);//前序遍歷右子樹
}
//中序遍歷
void InorderTra(BiTree T)
{
  if(T == NULL)
  {
    return;
  }
  InorderTra(T->lchild);//中序遍歷左子樹
  printf("%c",T->data);//輸出結點數據,可更改為其他對結點的操作
  InorderTra(T->rchild);//中序遍歷右子樹
}
//后序遍歷
void PostorderTra(BiTree T)
{
  if(T == NULL)
  {
    return;
  }
  PostorderTra(T->lchild);//后序遍歷左子樹
  PostorderTra(T->rchild);//后序遍歷右子樹
  printf("%c",T->data);//輸出結點數據,可更改為其他對結點的操作
}

其中二叉樹的結構如下:

typedef struct BiTNode
{
  ElemType data;
  struct BiTNode *lchild,*rchild;
}BitNode,*BiTree;

希望本文所述對大家C++程序設計有所幫助。

相關文章

  • c語言獲取直播吧最近一周nba比賽信息

    c語言獲取直播吧最近一周nba比賽信息

    這篇文章主要介紹了使用c語言獲取直播吧最近一周nba比賽信息的方法,需要的朋友可以參考下
    2014-04-04
  • C++無法打開源文件bits/stdc++.h的問題

    C++無法打開源文件bits/stdc++.h的問題

    這篇文章主要介紹了C++無法打開源文件bits/stdc++.h的問題以及解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • C++引用和結構體介紹

    C++引用和結構體介紹

    這篇文章主要介紹了C++引用和結構體,結構體是我們自定義的復合類型,本質上也是一種變量類型,所以一樣可以使用引用,下面來看看文章內容詳細介紹,需要的朋友可以參考一下
    2021-11-11
  • QT中QTableWidget加載大量數據不卡頓的解決

    QT中QTableWidget加載大量數據不卡頓的解決

    本文主要介紹了QT中QTableWidget加載大量數據不卡頓的解決,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-07-07
  • C語言圖書管理系統課程設計

    C語言圖書管理系統課程設計

    這篇文章主要為大家詳細介紹了C語言圖書管理系統課程設計,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++常用語句簡介

    C++常用語句簡介

    這篇文章主要介紹了C++常用語句簡介,文章將要介紹的常用語句有聲明變量、賦值語句、cin、cout語句、庫函數、自定義函數,需要的朋友可以參考一下,希望對你有所幫助
    2021-11-11
  • C++空指針void*的使用方法

    C++空指針void*的使用方法

    C++空指針void是一種通用指針類型,可以指向任何類型的數據或對象。它不關心指向的數據或對象的類型,只關心指針本身的地址,在使用void指針時,需要將其轉換為特定類型的指針,以便對其進行操作或訪問其值,本文就給大家介紹一下C++空指針void的使用方法
    2023-06-06
  • Qt5多線程編程的實現

    Qt5多線程編程的實現

    Qt通過三種形式提供了對線程的支持,本文主要介紹了Qt5多線程編程的實現,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • C語言函數棧幀詳解

    C語言函數棧幀詳解

    下面小編就為大家?guī)硪黄獪\談C語言函數調用參數壓棧的相關問題。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-10-10
  • C++中std::sort函數介紹和使用場景

    C++中std::sort函數介紹和使用場景

    std::sort函數是C++標準庫中常用的排序函數之一,它可以對各種類型的序列進行排序,本文就來介紹一下C++中std::sort函數介紹和使用場景,感興趣的可以了解一下
    2024-02-02

最新評論

安顺市| 攀枝花市| 萨迦县| 河池市| 铜川市| 新河县| 禄劝| 鹰潭市| 南昌县| 辛集市| 镇康县| 临洮县| 厦门市| 肥乡县| 革吉县| 宜兴市| 大竹县| 肇州县| 绥阳县| 盐山县| 肥城市| 乌兰察布市| 崇义县| 米脂县| 宜春市| 南岸区| 平安县| 马边| 东丽区| 南丹县| 乐山市| 措美县| 双辽市| 奉化市| 扶沟县| 新密市| 延庆县| 商南县| 陇南市| 琼结县| 茶陵县|