国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++基于遞歸和非遞歸算法求二叉樹鏡像的方法

2020-02-24 14:25:28
字體:
來源:轉載
供稿:網友

二叉樹中的元素自上而下地放置在數組中,易于遞歸實現,其實容器用于存儲前一個狀態實現循環以創建二叉樹,下面武林技術頻道就給大家介紹C++基于遞歸和非遞歸算法求二叉樹鏡像的方法。

具體如下:

/*求二叉樹鏡像 -- 采用遞歸和非遞歸方法經調試可運行源碼及分析如下:***/#include <stdlib.h>#include <iostream>#include <queue>using std::cout;using std::cin;using std::endl;using std::queue;/*二叉樹結點定義*/typedef struct BTreeNode{  char elem;  struct BTreeNode *pleft;  struct BTreeNode *pright;}BTreeNode;/*求二叉樹鏡像遞歸方式步驟:如果proot為NULL,則為空樹,返回;如果proot不為NULL,交換proot左右結點,然后分別求左右子樹的鏡像;*//*遞歸求二叉樹鏡像*/void get_bitree_mirror(BTreeNode* proot){  if (proot == NULL)    return ;  BTreeNode* temp_node = proot->pleft;  proot->pleft = proot->pright;  proot->pright = temp_node;  get_bitree_mirror(proot->pleft);  get_bitree_mirror(proot->pright);  return ;}/*非遞歸方式步驟如下:借助隊列首先,將根節點proot入隊;第一步:當隊列非空時,獲取當前層次的節點總數,即當前隊列的長度;執行第二步;第二步:按照當前層的節點總數,出隊進行遍歷節點,在遍歷時,    交換左右節點,如果左右節點存在,則入隊;    當遍歷完當前層所有節點時,遍歷下一層,執行第一步。*/void get_bitree_mirror_leveltraverse(BTreeNode* proot){  if(proot == NULL)    return ;  queue <BTreeNode*> que;  que.push(proot);  int level_nodes_number = 0;  while (!que.empty())//層次遍歷  {    level_nodes_number = que.size();    int level_count = 0;    while (level_count < level_nodes_number)    {      ++level_count;      proot = que.front();      que.pop();      //交換左右子節點      BTreeNode* temp_node = proot->pleft;      proot->pleft = proot->pright;      proot->pright = temp_node;      if(proot->pleft != NULL)        que.push(proot->pleft);      if(proot->pright != NULL)        que.push(proot->pright);    }  }  return ;}/*初始化二叉樹根節點*/BTreeNode* btree_init(BTreeNode* &bt){  bt = NULL;  return bt;}/*先序創建二叉樹*/void pre_crt_tree(BTreeNode* &bt){  char ch;  cin >> ch;  if (ch == '#')  {    bt = NULL;  }  else  {    bt = new BTreeNode;    bt->elem = ch;    pre_crt_tree(bt->pleft);    pre_crt_tree(bt->pright);  }}/*先序遍歷*/void pre_order_traverse(BTreeNode* proot){  if(proot == NULL)    return;  cout<< proot->elem << " ";  pre_order_traverse(proot->pleft);  pre_order_traverse(proot->pright);  return;}int main(){  int tree_node_number = 0;  BTreeNode *bt;  btree_init(bt);//初始化根節點  pre_crt_tree(bt);//創建二叉樹  cout << "先序遍歷輸出如下:" << endl;  cout << "調用鏡像函數前:" << endl;  pre_order_traverse(bt);  cout << endl;  get_bitree_mirror(bt);  cout << "遞歸調用鏡像函數后:" << endl;  pre_order_traverse(bt);  cout << endl;  cout << "非遞歸調用鏡像函數后:" << endl;  get_bitree_mirror_leveltraverse(bt);  pre_order_traverse(bt);  cout << endl;  system("pause");  return 0;}
/*運行結果:a b c # # # d e # # #------以上為輸入-----------------以下為輸出-----------先序遍歷輸出如下:調用鏡像函數前:a b c d e遞歸調用鏡像函數后:a d e b c非遞歸調用鏡像函數后:a b c d e請按任意鍵繼續. . .---------------------------------本例創建的二叉樹形狀:    a  b    dc     e調用遞歸求二叉樹鏡像形狀:   ad    b  e    c再次調用非遞歸求二叉樹鏡像形狀(即鏡像的鏡像):    a  b    dc     e*/以上就是武林技術頻道小編給大家介紹的C++基于遞歸和非遞歸算法求二叉樹鏡像的方法,如若您想要學習更多的技術專業知識可點擊進入js.Vevb.com。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 会东县| 松潘县| 新兴县| 凌海市| 维西| 盖州市| 长海县| 商丘市| 阳西县| 胶南市| 琼结县| 平谷区| 乐陵市| 永德县| 麟游县| 焉耆| 兖州市| 虹口区| 马鞍山市| 闽侯县| 冕宁县| 西乌珠穆沁旗| 海南省| 合水县| 天镇县| 日喀则市| 三门峡市| 全椒县| 贞丰县| 舒兰市| 叙永县| 台南县| 屯留县| 安多县| 泰州市| 定结县| 健康| 渑池县| 新河县| 石阡县| 伊金霍洛旗|