溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++中基于遞歸和非遞歸算法如何求二叉樹鏡像

發(fā)布時間:2021-08-09 09:35:21 來源:億速云 閱讀:165 作者:小新 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)C++中基于遞歸和非遞歸算法如何求二叉樹鏡像,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

具體如下:

/*求二叉樹鏡像 -- 采用遞歸和非遞歸方法
經(jīng)調(diào)試可運行源碼及分析如下:
***/
#include <stdlib.h>
#include <iostream>
#include <queue>
using std::cout;
using std::cin;
using std::endl;
using std::queue;
/*二叉樹結(jié)點定義*/
typedef struct BTreeNode
{
  char elem;
  struct BTreeNode *pleft;
  struct BTreeNode *pright;
}BTreeNode;
/*
求二叉樹鏡像
遞歸方式步驟:
如果proot為NULL,則為空樹,返回;
如果proot不為NULL,交換proot左右結(jié)點,然后分別求左右子樹的鏡像;
*/
/*遞歸求二叉樹鏡像*/
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 ;
}
/*
非遞歸方式步驟如下:
借助隊列
首先,將根節(jié)點proot入隊;
第一步:當(dāng)隊列非空時,獲取當(dāng)前層次的節(jié)點總數(shù),即當(dāng)前隊列的長度;執(zhí)行第二步;
第二步:按照當(dāng)前層的節(jié)點總數(shù),出隊進(jìn)行遍歷節(jié)點,在遍歷時,
    交換左右節(jié)點,如果左右節(jié)點存在,則入隊;
    當(dāng)遍歷完當(dāng)前層所有節(jié)點時,遍歷下一層,執(zhí)行第一步。
*/
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();
      //交換左右子節(jié)點
      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 ;
}
/*初始化二叉樹根節(jié)點*/
BTreeNode* btree_init(BTreeNode* &bt)
{
  bt = NULL;
  return bt;
}
/*先序創(chuàng)建二叉樹*/
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);//初始化根節(jié)點
  pre_crt_tree(bt);//創(chuàng)建二叉樹
  cout << "先序遍歷輸出如下:" << endl;
  cout << "調(diào)用鏡像函數(shù)前:" << endl;
  pre_order_traverse(bt);
  cout << endl;
  get_bitree_mirror(bt);
  cout << "遞歸調(diào)用鏡像函數(shù)后:" << endl;
  pre_order_traverse(bt);
  cout << endl;
  cout << "非遞歸調(diào)用鏡像函數(shù)后:" << endl;
  get_bitree_mirror_leveltraverse(bt);
  pre_order_traverse(bt);
  cout << endl;
  system("pause");
  return 0;
}
/*
運行結(jié)果:
a b c # # # d e # # #
------以上為輸入-----------
------以下為輸出-----------
先序遍歷輸出如下:
調(diào)用鏡像函數(shù)前:
a b c d e
遞歸調(diào)用鏡像函數(shù)后:
a d e b c
非遞歸調(diào)用鏡像函數(shù)后:
a b c d e
請按任意鍵繼續(xù). . .
---------------------------------
本例創(chuàng)建的二叉樹形狀:
    a
  b    d
c     e
調(diào)用遞歸求二叉樹鏡像形狀:
   a
d    b
  e    c
再次調(diào)用非遞歸求二叉樹鏡像形狀(即鏡像的鏡像):
    a
  b    d
c     e
*/

關(guān)于“C++中基于遞歸和非遞歸算法如何求二叉樹鏡像”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,使各位可以學(xué)到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI